Programátorovo čisté svědomí 0
Počítejte s různými prostředími
Nedávno jsem měl v práci možnost opravovat jednoduchý skript (jednoduchá objednávka s odesláním mailu) a pousmál jsem se, co vytvořilo ten humbuk. Stačilo přesunutí na nový server, kde měla direktiva error_reporting v PHP jinou výchozí hodnotu. Téměř celý web se ocitl v jedné chybě jen proto, že byly najednou zobrazeny chyby úrovně E_NOTICE.
Přestože většinou tyto zprávy neovlivní chod aplikaci s omezeným error reportingem, jsou známkou špatného programování, ať už z uspěchanosti, unavenosti nebo pouhé lenosti. Kód by měl být vždycky takový, že se tyto zprávy vypisovat nebudou.
Ukázkový příklad je získání proměnné z globálního pole $_GET nebo $_POST, což je velmi často využíváno při zpracování formulářů (spíše téměř vždy):
$message = $_GET['message'];
Nyní si zapněte výpis E_NOTICE a koukněte co se stane, pokud stránku načtete; PHP vás varuje, že pouíváte nedefinovaný index pole $_GET.
Správný zápis vypadá následovně. V této fázi se rovněž uplatní zkontrolovat datový typ, který očekáváte, hlavně u integerů.
$message = isset($_GET['message']) ? $_GET['message'] : '';
Kromě nedefinovaného indexu pole je druhou nejčastější chybou nedefinovaná proměnná. PHP je v tomto ohledu velmi flexibilní, až mi někdy přijde, že je to příliš. Pokud kontrolujete hodnotu proměnné, ujistěte se, jestli vůbec byla definovaná. Ještě lépe vždy proměnnou sami definujte, kontrola neinicializovaných proměnných může být s zapnutou direktivou register_globals velmi nebezpečná.
Dalším případem může být zapisovatelnost adresáře nebo souboru, se kterými vaše skripty počítájí. Místo toho, abyste byli nemale překvapeni, když skript nenajde to co potřebuje, nejdříve zkontrolujte, zda-li má dostatečná oprávnění. V takovém to výčtu mohu jít mnohem dál, pokud bych shrnul nejčastější prohřešky v tomto ohledu, tak si představím toto:
- Počítejte s všemi možnými situacemi, váše aplikace by měla běžet bez chyb nehledě na prostředí (pokud není stanoveno jinak v požadavcích, například přítomnost určitého rozšíření nebo binárky)
- Dávejte si pozor s čím pracujete, nepokládejte za samozřejmé, že je proměnná definovaná, ověřte si, že funkce dává výstup jaký očekávejte
- Vhodně a včas zachyťte výjimky a zpracujte je
Nenechte vaše skripty, aby se vám vymkly z rukou
Uživatelé na vašem webu mohou být hraví, mohou zkoušet různé parametry (např. pokud máte někde script.php?action=delete), zadávat nesmyslné hodnoty, budou se pokoušet probourat do vaši aplikaci. Nenechte je, a postavte vaši aplikaci tak, aby jste ji ovládali vy a vědeli co dělá. Musíte to ale udělat tak, aby to co nejméně zasáhlo samotného uživatele.
Na formulářích je to vidět ze všeho nejlépe, vždy si ověřte zadávané hodnoty. Využijete regulérní výrazy, kontrolu délky, někdy postačí jen kontrola datového typu. Pokud uživatel něco zadá špatně, buďte vlídní a přesměrujte ho zpátky a naveďte ho na správné řešení.
Pokud je možno více druhů zápisu nějakého pole, zkuste je zpracovat více způsoby a pokud i tehdy nebudou zadaná data dávat smysl, přesměrujte uživatele zpět a mile ho upozorněte.
Opomenutím tohoto bodu se často můžete vystavit nepříjemným věcem jako jsou XSS útoky, z nedávné doby jistě každý ví o co jde. Hlavní pravidlo tedy zní:
Předpokládejte, že uživatel může udělat cokoliv na vašem webu, dovolte mu provést jen to, co by měl!
Nepodceňte bezpečnost
Toto téma jenom zmíním ve zkratce, zaslouží si mnohem více prostoru než zde můžu poskytnout a mnoho lidí už napsalo lepší články, než bych dokázal já.
Při návrhu a psaní aplikace je potřeba dbát na bezpečnost vašich skriptů, různé zkratky jako XSS, CSRF nebo třeba SQL Injection jsou vám jistě známé.
Při tom stačí velmi málo, abyste jim zabránili. Ověřujte veškeré uživatelské proměnné a pro různé případy escapujte obsah podle potřeby.
S tímto okruhem je často spojena jedna otázka, a to jestli povolit HTML v uživatelských formulářích. V tomhle ohledu je moje stanovinsko ne, všechny způsoby filtrování značek nejsou stoprocentní a už vůbec nejsou flexibilní. Na místě je použít nějaký alternativní značkovací jazyk, jako je Texy nebo vlastní implementace známého BBCode
Závěřem
Pokud tvoříte nějakou aplikaci, piště ji s co nejlepším svědomím a snažte se dodržet všechny principy, které jsem tu sepsal. Zároveň se ale nebojte své nedokonalosti, mnoho mých skriptů by někdo napsal mnohem lépe a už mnohokrát by pomohl kritický pohled jiného člověka. Nebojte se vaši práci konzultovat s někým jiným a nechat si poradit s efektivnějšími postupy.
