Filter
Asi nejvýznamnější novinkou v PHP 5.2 je rozšíření Filter. Toto rozšíření není zcela nové, v minulosti bylo k dispozici v knihovně PECL, do PHP 5.2 ale bylo umístěno s výstižnějšími názvy funkcí a mírně upraveným API. Rozšíření Filter slouží pro jednotnou kontrolu a úpravu dat, především pro kontrolu dat zadaných uživatelem a pro použití v situacích, kdy mají určité znaky speciální význam (např. v HTML nebo SQL). Pro filtrování dat přišlých od uživatele se používá funkce filter_input nebo hromadná filter_input_array, pro filtrování vlastních proměnných se používají funkce filter_var a filter_var_array.
Filtrů je celá řada, rozdělit je můžeme do tří skupin:
- Validační filtry
- Kontrolují, jestli hodnota splňuje daná kritéria. Pokud ano, tak ji vrátí ve správném typu, jinak vrátí false. Patří sem např. filtry int, validate_url, validate_email nebo validate_ip. Pomocí filtru validate_regexp lze kontrolu provádět pomocí vlastního regulárního výrazu.
- Sanitizační filtry
- Odstraňují z hodnoty nežádoucí znaky nebo je nahrazují. Patří sem např. filtry number_int, stripped (odstranění značek), special_chars (zakódování znaků
<>&"'
), encoded (zakódování pro URL), magic_quotes (aplikování funkce addslashes), email nebo url. - Vlastní filtry
- Jsou realizovány uživatelsky definovanými funkcemi, které se volají pomocí filtru callback.
Chování většiny filtrů se dá navíc ovlivnit dalšími volbami, jejichž přehled je v dokumentaci.
Kromě ručního filtrování hodnot lze pomocí direktivy filter.default zapnout i implicitní filtrování všech dat přišlých od uživatele. K původním hodnotám se potom dá dostat pouze přes rozšíření Filter po aplikování požadovaného filtru (pokud data nijak upravit nechceme, dá se použít speciální filtr unsafe_raw). V tom případě se automaticky filtrují pole $_GET, $_POST, $_COOKIE, $_SERVER a $_ENV, pole $_REQUEST a $_SESSION se zatím nefiltrují a nedají se použít ani ve funkci filter_input.
<?php
$search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
$search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED);
echo "Hledali jste <code>$search_html</code>.\n";
echo "<a href='?search=$search_url'>Hledejte znovu.</a>";
?>
Rozšíření JSON, DateTime a ZIP
Jednoduché rozšíření JSON umožňuje převádět data do formátu JavaScript Object Notation a opět je z něj načítat. Funkce json_encode zakóduje libovolnou hodnotu kromě typu resource, funkce json_decode ji zase rozkóduje. Vzhledem k tomu, že se neukládají metody objektů, lze funkcí json_decode určit, zda se mají místo objektů vracet asociativní pole.
<?php
$a = array("a" => 5, 6);
print_r(json_encode($a)); // {"a":5,"0":6}
?>
V PHP 5.1 byla přepracována práce s datem, pro uložení konstant byla bohužel zvolena třída s nevhodně zvoleným názvem date. Tato třída se nyní vrací pod názvem DateTime a s novými metodami.
Rozšíření pro práci s archivy typu ZIP je v PHP k dispozici už dávno, dříve ale záviselo na knihovně třetí strany a archivy se daly pouze číst. Nová verze tohoto rozšíření knihovnu nepotřebuje a podporuje i zápis.
Další novinky
- Z nových funkcí stojí za zmínku především array_fill_keys umožňující vytvořit pole s přednastavenými klíči a error_get_last vracející poslední chybu v asociativním poli. V souvislosti s touto funkcí je vhodné zmínit i novou úroveň chyb E_RECOVERABLE_ERROR, kterou je možné ošetřit funkcí určenou pomocí set_error_handler, nicméně pokud se tak nestane, je program ukončen. Touto chybou bylo nahrazeno vracení chyb E_ERROR v situacích, které neuvedou PHP do nestabilního stavu.
- Funkce setcookie, setrawcookie a session_set_cookie_params dostaly nový parametr httponly, kterým se dá v Internet Exploreru 6 a novějším (ve Firefoxu 2 spolu s rozšířením) zakázat čtení cookies JavaScriptem. Automatické nastavování tohoto parametru při práci se sessions zajišťuje direktiva session.cookie_httponly.
- PHP 5.2 také konečně umožňuje vytvářet rozšíření zobrazující průběh nahrávání souboru na server. Konečnou implementaci potom zajišťuje např. rozšíření UploadProgress.
- Volání funkce __toString bylo rozšířeno na všechna možná místa, takže už se programátoři nebudou divit, proč volání kódu
echo $obj . ""
vypíše na rozdíl odecho $obj
pouzeObject id #1
. - Protokol
data://
, který vešel ve známost především v souvislosti s testem ACID2, je nyní možné používat i v PHP.
Další, ne již však tak významné novinky jsou popsány v instrukcích pro přechod ze starších verzí.
Bezpečnost
Z konfigurační direktivy allow_url_fopen byla vyčleněna direktiva allow_url_include, která zakazuje použití protokolu http://
a podobných pouze ve funkcích pro vkládání souborů. Nicméně stejně jako direktiva allow_url_fopen ani tato nezakazuje použití protokolů php://
a nového data://
, takže se pro zabránění vzdáleného spuštění použít nedá. Pro tento problém nicméně již existuje patch, takže snad začne tato bezpečnostní pojistka svou funkci doopravdy plnit již brzy.
Za zmínku určitě stojí značné množství oprav týkajících se bezpečnosti. S aktualizací na novou verzi tedy není radno otálet.