Jun 30 2009

PHP 5.3, Firefox 3.5, Debian 5.0.2, PDT 2.1

Tag: ZprávičkyJens @ 21:20

Začalo léto, polovina roku je pryč a vývojáři všeho druhy se zřejmě chystají na dovolenou :) a dokončují co mohou. Konec června a začátek července charakterizuje uvolnění spoustu důležitých verzí softwaru pro vývoj webových aplikací.

  • PHP 5.3.0 – začněme tím nejdůležitějším a nejaktuálnějším, dnes (30.6.2009) byla oficiálně vydána dlouho očekávaná a významná verze PHP 5.3.0, která přináší především podporu jmenných prostorů (namespaces), late static binding (u statické metody lze mimo jiné určit, kterou třídou je vyvolána) a lambda (anonymní) funkce a uzávěry.
  • Firefox 3.5 – další, opět velmi podstatná a aktuální událost je dnešní vydání „nového“ Firefoxu ve verzi 3.5, který přináší některá podstatná vylepší v práci s pamětí (menší paměťové nároky jsou u firefoxe evergreen:), zrychlený JavaScript (použití enginu TraceMonkey), anonymní prohlížení. Jednou z nejvíce očekávanou novinkou je však podpora některých elementů (audio, video) nově vznikající specifikace HTML 5.
  • Debian GNU/Linux 5.0.2 – další aktualizace se týká aktuální stable verze Debianu (Lenny), jedná se tedy již o druhé opravné vydání (vydáno 27.6.2009) a opravuje klasicky několik bugů a bezpečnostních chyb, více viz oficiální oznámení.
  • PHP Development Tools Project 2.1 – a posledním vydáním (26.6.2009) uzavírá vývojové prostředí PDT 2.1 postavené na platformě Eclipse — obsahuje mimo jiné podporu pro PHP 5.3 a namespaces. Z mé osobní zkušenosti je však PDT od verze 2.0 poměrně zabugované a nepřenáší žádné větší vylepšení za které by stálo přejít z podstatně svižnější verze 1.3

Jun 29 2009

Nastavení PHP pro větší bezpečnost

Tag: PHPJens @ 23:30

O tom, jak zvýšit bezpečnost PHP aplikací již bylo napsáno moc a moc. Prvním a základním pravidel je filtrování vstupů uživatelů, na toto téma již bylo popsáno nepřeberné množství přístupů a naprogramováno spousty knihoven, které dělají téměř vše za vás. Druhým, neméně důležitým aspektem je konfigurace PHP direktiv, ať již v přímo v php.ini nebo pomocí ini_set(...) či v htaccessu. To, na jaké direktivy by jste se měli zaměřit především, se pokouší odpovědět i PHP Security Consortium ve svém projektu PhpSecInfo.

PhpSecInfo

PhpSecInfo se zaměřuje na řadu klíčových direktiv, které jsou z hlediska bezpečné konfigurace PHP důležité, doporučuje jejich nastavení, popisuje důvody proč je nastavit tak a tak a poskytuje vám přehlednou aplikaci v PHP na to, aby jste si sami mohly vyzkoušet nastavení vašeho serveru či virtualhostu.

Pojďme se blíže na jednotlivé testy a k nim odpovídající direktivy podívat (seznam testů je řazen abecedně, nikoliv podle důležitosti):

  • allow_url_fopen
    - defaultně on, doporučená hodnota off
    - v případě že je povoleno, může skript používat funkce file_get_contents(), include(), require(), … na vzdálené soubory, což může způsobit vložení závadného kódu z cizího serveru pokud správně neošetříte vstupy
    - více o allow_url_fopen direktivě/testu
  • allow_url_include
    - defaultně 0, doporučená hodnota 0
    - podobný problém jako allow_url_fopen
    - více o allow_url_include direktivě/testu
  • display_errors
    - defaultně on, doporučená hodnota na produkčním serveru off
    - vhodné mít zapnuté při ladění a vývoji, na produkčním serveru se doporučuje vypnout
    - více o display_errors direktivě/testu
  • expose_php
    - defaultně on, doporučená hodnota off
    - rozhodně vypnout vždy, umožňuje potenciálnímu útočníkovi zjistit relativně přesně verzi PHP na serveru a na základě toho využít potencionální bezpečnostní chyby
    - více o expose_php direktivě/testu
  • file_support
    - v tomto případě se nejedná o konfigurační direktivu ale pouze název testu, který ověřuje zda vaše verze PHP obsahuje opravu problému zranitelnosti v knihovně cURL
    - více o file_support testu
  • file_uploads
    - defaultně on, v případě že ve vaší aplikaci nahrávání souborů nepoužíváte, doporučuje se nastavit off
    - více o file_uploads direktivě/testu
  • force_redirect
    - defaultně on, doporučená hodnota on
    - direktiva, která se používá pouze v případě že spouštíte PHP přes CGI, na některých web serverech vypnutá (IIS)
    - více o force_redirect direktivě/testu
  • group_id
    - nejedná se o direktivu PHP ale proměnou skriptu, tato proměnná definuje ID skupiny systému pod kterým je PHP skript spuštěn a tento test upozorňuje na možné riziko spuštění skriptu privilegovaným/systémovým uživatelem
    - více o group_id testu
  • magic_quotes_gpc
    - defaultně on, doporučená hodnota off
    - velice známá a v minulosti často diskutovaná direktiva – je-li direktiva zapnuta, pak budou všechny vstupní proměnné _GET, _POST, _COOKIE (a možná i některé další) escapovány pomocí addslashes
    - direktiva magic_quotes_gpc byla přídána především pro zabránění SQL injection, nicméně později se ukázalo, že funkce addslashes není zcela dostačující pro některé speciální případy a proto se musí používat speciální escapovací funkce v závislosti na použité databázi, spoléhat tedy na „auto-escapování“ není dobré a proto se doporučuje direktivu nezapínat
    - více o magic_quotes_gpc direktivě/testu
  • memory_limit
    - maximální povolená hodnota paměti, kterou může PHP skript alokovat – doporučenou hodnotu těžko definovat, obecně čím méně tím lépe nicméně je třeba brát v úvahu „žravost“ některých knihoven typu Zend Framework, které si s pamětí starosti nedělají a alokují co mohou
    - více o memory_limit direktivě/testu
  • open_basedir
    - tato direktiva by měla nahradit safe_mod, který je zlem vždy a všude – direktiva open_basedir definuje, do kterých adresářů na fyzickém filesystému se PHP skripty dostanou a kam už ne
    - v případě hostingového serveru nebo serveru s více uživateli, je správně nastavený open_basedir nezbytnost
    - více o open_basedir direktivě/testu
  • post_max_size
    - defaultně 8 MB, doporučená hodnota 256 K
    - definuje jakou maximální velikost dat lze odeslat PHP skriptu pomocí metody POST – doporučená hodnota je zde poměrně nízká a lze o ni dosti polemizovat, vždy je třeba zvážit potřeby aplikace, příliš vysoká hodnota může znamenat možnost DoS útoku na server
    - více o post_max_size direktivě/testu
  • register_globals
    - defaultně off, doporučená hodnota off
    - tuto direktivu snad není třeba ani popisovat – jedná se o historický pozůstatek z divokých dob PHP, zakázat vždy a všude – více o register_globals direktivě/testu
  • save_path
    - tato direktiva (přesněji session.save_path) definuje cestu, kde se budou ukládat data uživatelských session – cesta by měla být mimo strukturu kořene webu (document root) a měla by mít vhodně nastavená oprávnění (aby si session nemohli číst ostatní uživatelé systému)
    - více o save_path direktivě/testu
  • upload_max_filesize
    - definuje jakou maximální velikost dat lze odeslat PHP skriptu pomocí nahrávacího (upload) formuláře – doporučená hodnota musí vycházet z potřeb konkrétní aplikace, obecně čím méně tím lépe
    - více o upload_max_filesize direktivě/testu
  • upload_tmp_dir
    - definuje cestu, kde se ukládají dočasně soubory, které jsou nahrávány na server pomocí formuláře – podobně jako direktiva save_path by měla být tato cesta mimo strukturu kořene webu a měla by mít vhodně nastavená oprávnění
    - více o upload_tmp_dir direktivě/testu
  • user_id
    - nejedná se o direktivu PHP ale proměnou skriptu, tato proměnná definuje ID uživatele systému pod kterým je PHP skript spuštěn a tento test upozorňuje na možné riziko spuštění skriptu privilegovaným/systémovým uživatelem
    - více o file_uploads testu

Popsané výchozí nastavení se vždy nemusí shodovat v vašim výchozím nastavení, některé distribuce a operační systémy a některé verze PHP si nastavují tyto hodnoty různě.

Před nastavením dané proměnné je vždy také třeba zvážit, zda bude server či VirtualHost pro více projektů/uživatelů. Důležité je také zvážit, jestli nasazení omezujících pravidel v podobě změn PHP direktiv neovlivní současné projekty na serveru, které by se pak museli předělat vzhledem ke změně nastavení. Proto je vhodné použít kombinaci jak globálních nastavení v php.ini, tak lokálních pomocí ini_set(...) či htaccessu.

Závěr

Bohužel, projekt PhpSecInfo už je přes dva roku opuštěn (poslední verze je z 2007/04/06) a těžko říci, zda kdy bude ještě aktualizován. Myslím že je to škoda, protože stále vznikají nové a nové hrozby, přidávají se nové konfigurační direktivy (a některé se ruší) a pro začínajícího ale i pokročilého administrátora mohl být projekt dobrým zdrojem informací a inspirace.