Filter a další novinky v PHP 5.2

Jakub Vrána 7. 11. 2006

PHP 5.2 slibuje podobně jako každá větší verze téměř jakéhokoliv produktu významné zrychlení, bezpečnostní záplaty, aktualizované knihovny a spoustu dalších oprav a vylepšení. Některé novinky jsou ale významnější a vyplatí se na ně podívat podrobněji.

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_a­rray, 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_ER­ROR, kterou je možné ošetřit funkcí určenou pomocí set_error_han­dler, 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_co­okie_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.cooki­e_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 od echo $obj pouze  Object 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_inclu­de, 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.

Našli jste v článku chybu?
120na80.cz: Osvěžte se jídlem

Osvěžte se jídlem

Lupa.cz: Elektronika tajemství zbavená. Jak s ní začít?

Elektronika tajemství zbavená. Jak s ní začít?

Vitalia.cz: Za její cukrovkou stojí rodiče

Za její cukrovkou stojí rodiče

Měšec.cz: Platíme NFC mobilem. Konečně to funguje!

Platíme NFC mobilem. Konečně to funguje!

Měšec.cz: Se stavebkem k soudu už (většinou) nemusíte

Se stavebkem k soudu už (většinou) nemusíte

Vitalia.cz: Galerie: Strouhanka ze starých rohlíků? Kdepak

Galerie: Strouhanka ze starých rohlíků? Kdepak

Lupa.cz: Samořídicí taxíky jsou tu. Začíná s nimi Uber

Samořídicí taxíky jsou tu. Začíná s nimi Uber

Měšec.cz: Co když na dovolené přijdete o kartu?

Co když na dovolené přijdete o kartu?

Vitalia.cz: Ženy, které milují příliš, jsou neštěstí

Ženy, které milují příliš, jsou neštěstí

Vitalia.cz: Je bílý kokos fakt tak úžasný? Ano, je!

Je bílý kokos fakt tak úžasný? Ano, je!

Vitalia.cz: 9 potravin, které nesmí chybět v jídelníčku těhotné

9 potravin, které nesmí chybět v jídelníčku těhotné

DigiZone.cz: Jetelín končí. Prima ho vyřadila

Jetelín končí. Prima ho vyřadila

Podnikatel.cz: Pozor na vykuky, imitují služby České pošty

Pozor na vykuky, imitují služby České pošty

Podnikatel.cz: Oznamte skutečné sídlo firmy, jinak zaplatíte

Oznamte skutečné sídlo firmy, jinak zaplatíte

Měšec.cz: Investiční pasti. Děláte to, co ostatní, ale proděláváte

Investiční pasti. Děláte to, co ostatní, ale proděláváte

Měšec.cz: Udali ho na nelegální software a přišla Policie

Udali ho na nelegální software a přišla Policie

DigiZone.cz: První Ultra HD (4K) Blu-ray je tady

První Ultra HD (4K) Blu-ray je tady

DigiZone.cz: ČTÚ zveřejnil aktualizovaný D-Book

ČTÚ zveřejnil aktualizovaný D-Book

Podnikatel.cz: Novela zákoníku práce. Řeší homeworking

Novela zákoníku práce. Řeší homeworking

Lupa.cz: Olympiáda zakázala GIFy. Moc to nepomáhá

Olympiáda zakázala GIFy. Moc to nepomáhá