Nejčastější chyby webových aplikací

Seznam nejčastějších chyb v zápočtových aplikacích, kterých byste se měli vyvarovat. Následující text je sice orientován primárně na PHP a MySQL, nicméně platí samozřejmě analogicky i na všechny ostatní jazyky a prostředí. Všechny chyby jsou zmiňovány a vysvětlovány na cvičeních, zde je tedy jen jejich prostý rychlý souhrn bez bližšího vysvětlení a rozebrání.

Neošetřený výstup (cross-site scripting)
Veškerý textový výstup do stránky ošetřit přes htmlspecialchars(), zejména pokud vypisujeme jakýkoliv vstup od uživatelů.
Neošetřený SQL dotaz (SQL injection)
Veškeré parametry vkládané do SQL dotazů musí být ošetřeny k tomu určenými funkcemi, nelze se spoléhat na zapnutou direktivu magic_quotes_gpc. Viz funkce mysql_real_escape_string a pro inspiraci u ní uvedená best practice.
Spoléhání se na register_globals
Pro získávání vstupních parametrů od uživatelů používat zásadně superglobální proměnné $_GET, $_POST, $_REQUEST, $_COOKIE. Použití automaticky registrovaných globálních proměnných je zcela chybné.
Použití neinicializovaných proměnných
Každá proměnná, než je poprvé použita, musí být inicializována. Používejte také hojně funkce empty(), isset() a is_null().
Bezpečnostní díry
Za chybu jsou samozřejmě považovány i jakékoliv další bezpečnostní díry, zejména ty nejčastější zmiňované na cvičení věnované bezpečnosti.
Používání session_register()
Pro práci se sessions používat na začátku skriptu volání session_start() a poté už jenom superglobální proměnnou $_SESSION. Jakékoliv použití takových funkcí, jako je session_register(), je chybné.
Session ID předávané v URL
Session ID by se mělo předávat výhradně přes cookies. Jeho výskyt v URL je chybný.
Používání <? místo <?php
Spoléhání se na zapnutou direktivu short_open_tag a použití krátkých variant otevíracích tagů, jako je <?, <% či <?=, je chybné. Jediný správný způsob je otevření přes <?php.
Neúplné URL v HTTP hlavičce Location:
Při přesměrování přes header('Location: http://www.example.com/foo.php') musí být uvedeno úplné URL včetně schématu a názvu serveru. Neúplné volání, například header('Location: index.php'), je chybné.
Zbytečné kopírování proměnných
Naprosto zbytečné konstrukce typu $foo = $_GET['foo']. Používejte místo toho všude v kódu přímo $_GET['foo'].
Používání ID v uživatelském rozhraní
Použití umělých klíčů u databázových záznamů musí být pro uživatele zcela transparentní. Používejte AUTO_INCREMENT a funkci mysql_insert_id().
Řetězce bez uvozovek
Řetězce patří do uvozovek. PHP je občas pochopí i bez uvozovek, ale hrozí riziko, že je za jistých okolností může považovat za názvy konstant. Následující použití "řetězců" je chybné: echo retezec; echo $pole[retezec];
Staré "endif" konstrukce
Použití zastaralých konstrukcí s dvojtečkou a následným endif, endwhile apod. je chybné. Používejte výhradně standardní céčkovské konstrukce se složenými závorkami.
Globální proměnné uvnitř funkcí
Potřebujete-li použít uvnitř jakékoliv funkce globální proměnnou, je něco špatně. Pokud ale nemůžete jinak, používejte důsledně $GLOBALS['foo']. Zcela zapomeňte na konstrukci global $foo.
Eval is evil
Pokud musíte použít funkci eval(), je něco špatně. Stejně tak nikdy nepoužívejte "variable variables". Aplikaci lze vždy napsat čistě i bez těchto konstrukcí.
Nesjednocené coding-standards
Ujasněte si, jakým způsobem budete pojmenovávat funkce, proměnné, tabulky, atributy. Kde budete používat malá a kde velká písmena, kde podtržítka, jak budete odsazovat vnořené bloky apod. Zvolený způsob pak používejte jednotně v celé aplikaci. Pro inspiraci viz PEAR Coding Standards, což je v PHP de facto standard.
Závislost na technologiích
Závislost funkčnosti aplikace na typu či verzi prohlížeče, Flashi či jiných méně rozšířených a nestandardních technologiích či pluginech do prohlížečů.

Pozorně si pročtěte také související text Na co jsou vyučující v aplikacích zvláště alergičtí.