Tento dokument je poskytován jako doplněk k Bezpečnost pro vývojáře.
Toto je seznam běžných vývojových úkolů a bezpečnostních opatření, která je třeba přijmout.
Bezpečnostní kontrolní seznam
Pokud pracujete s...
získáte ...
Soubory cookie prohlížeče
Snížení obav recenzenta použitím $wgRequest místo $_COOKIE?
Načetli jste soubory cookie pomocí $wgRequest->getCookie(...)?
Nastavujete cookies pomocí $wgRequest->response()->setCookie(...)?
# Pokuste se načíst hodnotu souboru cookie UserID.# Poznámka: Vrácená hodnota není důvěryhodná a je nucena být int.$sId=intval($wgRequest->getCookie('UserID'));
Je snazší vkládat libovolné řetězce do textu zpracovaného regulárními výrazy, což – v kombinaci s modifikátorem vzoru /e – může vést k útokům vkládání kódu.
Je těžší číst a udržovat kód, který je součástí řetězce.
Nástroje pro statickou analýzu nezachytí varování a chyby v kódu.
Mezipaměti operačních kódů (jako APC) nemohou ukládat kód smíšený do řetězců.
create_function() má někdy problémy se svozem odpadu.
Smyčka, která má uvnitř create_function(), vytvoří při každé iteraci novou funkci.
Někdy tyto funkce opravdu potřebujete (samozřejmě eval.php potřebuje ke spuštění eval();), ale ve většině případů bychom raději viděli funkci rozbitou a označovanou jako zpětné volání.
Inline funkce lambda usnadní vložení zpětného volání a zároveň si zachovají výhody kódu, který je napsán v nativní syntaxi namísto řetězců.
Cokoli externího, co se používá v části regulárního výrazu, by mělo být escapováno s preg_quote ($externalStr, $delimiter). Před každý znak, který je součástí syntaxe regulárního výrazu, vloží zpětné lomítko a uzavře také oddělovač zadaný jako druhý parametr:
Spustil se program přes Shell::command() z jmenného prostoru MediaWiki\Shell?
Citoval všechny argumenty externím programům pomocí výše uvedených možností předávání bezpečných parametrů (což je v podstatě všechno kromě unsafeParams())?
// Automaticky uniknout všem nevhodným znakům$result=Shell::command($cmd,'--version')->params('some','extra','parameters')->execute();
Všimněte si, že staré wfShellExec()/wfEscapeShellArg() se nedoporučují, protože vývojářům usnadňují přehlédnout escapování parametru.
# rawElement() escapuje všechny hodnoty atributů# (což v tomto případě poskytuje $myClass)echoHtml::rawElement('p',['class'=>$myClass]);
Snížili obavy recenzentů pomocí ResourceLoader k poskytování zdrojů CSS a JavaScript?
CSS poskytnuté uživatelem
CSS poskytnuté uživatelem (řekněme pro použití v atributu style) je třeba ošetřit, aby se zabránilo XSS a také aby bylo zakázáno vkládání sledovacích obrázků (prostřednictvím obrázku na pozadí) atd.
Použijte metodu Sanitizer::checkCss pro jakýkoli css přijatý od uživatele, případně spolu s třídou Html.
# nechť $CSSFromUser je CSS uživatele.echoHtml::rawElement('p',['style'=>Sanitizer::checkCss($CSSFromUser)]);
U CSS poskytovaných rozšířením (a ne uživatelem) to není potřeba (a odstraní některé platné věci jako background-image:). CSS poskytované rozšířením by však mělo být použito v šablonách stylů načtených ResourceLoader, nikoli v atributech style.
Data POST
Snížení obav recenzenta použitím $wgRequest místo $_POST
Vždy ověřte, že všechna přijatá data POST odpovídají tomu, co očekáváte
# Zkontrolujte, zda je parametr akce nastaven na 'render'if($wgRequest->getVal('action')=='render'){...
Jasně přidané komentáře k vysvětlení neočekávaných nebo zvláštních částí vašeho kódu?
# $wgRequest zatím není k dispozici. Místo toho je vynuceno použití $_GET.if($_GET['setupTestSuite']!==null){$setupTestSuiteName=$_GET['setupTestSuite'];...
Některé z těchto problémů lze zkontrolovat pomocí phan-taint-check-plugin, který je vyžadován pro veškerý kód MediaWiki v produkci Wikimedie.
Toto je samozřejmě pouze nástroj, který nedokáže detekovat všechny typy problémů a může přehlédnout problémy i u typů problémů, které dokáže zkontrolovat.