Základní kurz 16: „Zapovězené“ funkce

Autor: Joker
Cílem základního kurzu bylo naučit základy, jak programovat v PHP. PHP ale prošlo dlouhým vývojem, hlavně u raných verzí nebyly všechny vlastnosti promyšlené do důsledku a přidání některých se časem ukázalo jako špatný nápad. Některé jiné ve své době fungovaly, ale dnes už jsou zastaralé a překonané.

Přesto se s použitím takových vlastností můžete setkat ve starších učebnicích, ukázkách a případně skriptech, které chcete převzít do svého projektu. Na konci základního kurzu se proto podívejme na téma, jak neprogramovat v PHP, resp. na věci, se kterými se můžete setkat a neměli byste je do svých skriptů přebírat.

PHP rozšíření Mysql (mysql_*) a POSIX (ereg*)

Funkce z rozšíření Mysql (začínají na mysql_, např. mysql_connect, mysql_query) a z rozšíření POSIX (začínají na ereg, vč. samotného ereg, dále také split, spliti a sql_regcase) jsou ve starších skriptech poměrně často používané, ale dnes už tato rozšíření jsou zastaralá, nevyvíjejí se a v budoucnu budou z PHP odstraněna. Proto je lepší je pro nové projekty nepoužívat.

Místo rozšíření Mysql můžete používat například Mysqli nebo PDO.

Místo rozšíření POSIX použijte PCRE (funkce preg_*).

eval

Příkaz eval umožňuje zpracovat libovolný PHP kód, předaný do příkazu jako řetězec.

Problém spočívá ve vyhodnocení kódu, u kterého není zřejmé, co v něm je. Velmi nebezpečné je to hlavně když se vstup do eval vytváří z dat od uživatele. Zabezpečit vstupy někdy nebývá úplně jednoduché a zároveň jakékoliv opomenutí může vést k možnosti na webu spustit libovolný (útočníkem dodaný) PHP kód.

Příkaz eval by se měl používat jen pokud dobře víte, co děláte. Začátečník se ale prakticky nikdy nedostane do situace, kdy by ho reálně potřeboval. Pokud ho potřebujete, s největší pravděpodobností jste někde v návrhu aplikace udělali chybu.

Pokud eval() je odpověď, téměř jistě se ptáte na špatnou otázku.
Rasmus Lerdorf, původní autor PHP

Proměnné proměnné

PHP obsahuje jednu bizarní vlastnost: Název proměnné lze vytvořit z hodnoty jiné proměnné:

$nazev = "promenna";
$$nazev = "hodnota"; // vytvoří proměnnou $promenna

Nejspíš to není k ničemu užitečné a těžko říct, proč něco takového vůbec součástí PHP je. Asi nejčastěji to používají začínající programátoři k vytváření sekvencí proměnných, např. $promenna1, $promenna2, $promenna3, atd. Čtenáři základního kurzu by mělo být zjevné, že takové použití je cosi jako náhražka za pole a je výhodnější použít skutečné pole.

register_globals

Před zavedením superglobálních polí $_GET, $_POST, atd. PHP data od uživatele předávalo tak, že jednoduše vytvořilo proměnnou s příslušným názvem (pro to, co se dnes předá např. jako $_GET["nazev"] se kdysi vytvořila proměnná $nazev). Další verze takové chování umožňovaly v případě, že bylo v konfiguraci zapnuto register_globals.

Zapnutí register_globals je nebezpečné, protože při nedokonalém návrhu skriptu pak může uživatel ovlivnit i vnitřní proměnné skriptu, kde s tím programátor vůbec nepočítal. To byl i důvod, proč se mechanismus předávání dat změnil. Od PHP 5.4 bylo register_globals odstraněno úplně a není už možné ho zapnout.

Skripty, které by spoléhaly na zapnuté register_globals, ve svých projektech nepoužívejte.

addslashes, stripslashes a magic_quotes

Funkce addslashes přidává zpětná lomítka před některé znaky, které by v některých kontextech mohly být potenciálně nebezpečné (například uvozovky). Naopak stripslashes lomítka zase odebere. Původní myšlenka byla ošetřování vstupních dat hlavně pro použití v databázi a často se to tak i používalo. Funkce addslashes se ovšem snažila být univerzální pro více kontextů a ve výsledku pro žádný z nich neošetřuje data správně. Proto je nutné pro každý kontext použít funkci, která ošetří data správně (například mysqli_real_escape_string pro MySQL databázi).

Ale aby toho nebylo dost, měly starší verze PHP funkčnost magic_quotes_gpc, která automaticky použila addslashes na veškerá data předávaná přes GET, POST nebo cookies. A ještě k tomu byla podmíněná konfigurací, takže programátor se nemohl předem spolehnout ani že se použije, ani že se nepoužije. A k dovršení všeho, jak vyplývá z výše uvedeného, addslashes neošetřuje dostatečně, takže správný postup při zapnutí magic_quotes_gpc byl to ošetření zase zrušit (což je asi jediný případ smysluplného použití stripslashes) a udělat znovu a správně.

Naštěstí i tato funkčnost je od verze 5.4 odstraněna. Čili téměř jakékoliv použití addslashes a stripslashes je chybně. Výjimkou je situace, kdy má skript fungovat na serveru se starší verzí PHP a zapnutým magic_quotes_gpc, tam potřebujete stripslashes k odstranění přebytečných lomítek (skript, který odstraní lomítka způsobená magic_quotes_gpc, lze najít třeba zde).

session_register

Funkce session_register se používala k nastavování session proměnných před zavedením $_SESSION. V současných verzích PHP už nemá její použití smysl, používejte $_SESSION.

Máte návrh na vylepšení či doplnění článku? Obsahuje článek nepřesné informace, nebo v něm chybí něco důležitého?
Tento článek má diskusní vlákno na diskusi Jak Psát Web, kam můžete náměty a připomínky napsat.


Správcem webu Péhápko.cz je Joker, mail zavináč it-joker tečka cz. Informace o autorských právech a možnostech použití obsahu viz Autorská práva
Přihlášení