Jde o jednoduché pravidlo, které zabrání většině nejběžnějších bezpečnostních problémů: Respektujte kontext, ve kterém používáte data a ošetřete znaky, které mají v daném kontextu speciální význam.
Problém s tímto pravidlem je, že se na něj dá snadno zapomenout. Je mnohem jednodušší napsat echo $_GET["message"]
než echo htmlspecialchars($_GET["message"])
nebo $pdo->query("… LIMIT $_GET[limit]")
než:
<?php $stmt = $pdo->prepare("… LIMIT :limit"); $stmt->bindValue('limit', $_GET["limit"], PDO::PARAM_INT); $stmt->execute(); ?>
Správné řešení je použít abstrakci, která vám nedovolí udělat chybu. Např. v Nette Latte to znamená zakázat vkládání PHP kódu značkou <?php ?>
a neošetřeného HTML značkou {!$}
. U databázové abstrakce to může znamenat kontrolu toho, že se na místě dotazu používá výhradně konstantní řetězec pomocí statické analýzy.
Je důležité si uvědomit, že správné ošetřování dat neřeší jen bezpečností problémy, ale i problémy s použitelností. Narazíte na ně v situaci, kdy někdo vaší aplikaci pošle název McDonald's nebo <1337>. Důležité je proto toto pravidlo nepodcenit ani v situacích, kdy na bezpečnosti zdánlivě nezáleží, třeba v Intranetové aplikaci (i když tam na bezpečnosti záleží přesně stejně jako u veřejné aplikace).
Přijďte si o tomto tématu popovídat na školení Bezpečnost PHP aplikací.
Diskuse je zrušena z důvodu spamu.