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í.