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: Cestovní nevolnost. Co pomůže?

Cestovní nevolnost. Co pomůže?

Lupa.cz: Vydavatelé jsou v háji, ale neumí si to připustit

Vydavatelé jsou v háji, ale neumí si to připustit

DigiZone.cz: Deklarace kompatibility? Jen LG...

Deklarace kompatibility? Jen LG...

Podnikatel.cz: Zůstat na Heurece je čiré bláznovství

Zůstat na Heurece je čiré bláznovství

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

Root.cz: Quake slaví 20 let novou epizodou zdarma

Quake slaví 20 let novou epizodou zdarma

DigiZone.cz: Slováci první, Češi třetí. Krásný...

Slováci první, Češi třetí. Krásný...

120na80.cz: Krémy, nebo spreje na opalování?

Krémy, nebo spreje na opalování?

DigiZone.cz: Robinsonův ostrov moderuje Novotný

Robinsonův ostrov moderuje Novotný

DigiZone.cz: ČTÚ květen: rušení TV vysílání narůstá

ČTÚ květen: rušení TV vysílání narůstá

Podnikatel.cz: Chce s trdelníky ovládnout Asii. Poznejte ho

Chce s trdelníky ovládnout Asii. Poznejte ho

DigiZone.cz: HbbTV KinoSvět: už jede na dalších TV

HbbTV KinoSvět: už jede na dalších TV

120na80.cz: Léky a dietní opatření při kopřivce

Léky a dietní opatření při kopřivce

DigiZone.cz: Kritické poznámky k DVB-T2

Kritické poznámky k DVB-T2

Měšec.cz: Ceny PHM v Evropě. Finty na úspory

Ceny PHM v Evropě. Finty na úspory

Lupa.cz: Facebook tlačí Moments a hrozí mazáním fotek

Facebook tlačí Moments a hrozí mazáním fotek

Vitalia.cz: Máte chutě? Nejezděte do světa, ale do Dobřichovic

Máte chutě? Nejezděte do světa, ale do Dobřichovic

120na80.cz: Proč komáři létají hlavně večer?

Proč komáři létají hlavně večer?

DigiZone.cz: Kanály Novy na Slovensku oficiálně?

Kanály Novy na Slovensku oficiálně?

DigiZone.cz: Dabingové ceny znají letošní nominace

Dabingové ceny znají letošní nominace