Kontrolní seznam zabezpečení pro vývojáře

This page is a translated version of the page Security checklist for developers and the translation is 100% complete.

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' ) );

Dynamické generování kódu

Nepoužívejte funkce jako eval() a create_function() a také /e modifikátor vzoru za preg_replace(). Přestože jsou tyto funkce výkonné a pohodlné, jsou ze své podstaty nejisté:[1][2]

  • 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:
$str = preg_replace( "!" . preg_quote( $externalStr, '!' ) . "!", $replacement, $str );

Externí programy

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

Formuláře

Data GET

  • Snížení obav recenzenta použitím $wgRequest místo $_GET?
# Zkontrolujte, zda je parametr akce nastaven na 'purge'
if ( $wgRequest->getVal( 'action' ) == 'purge' ) {
    ...

Výstup (API, CSS, JavaScript, HTML, XML atd.)

Jakýkoli obsah, který MediaWiki generuje, může být vektorem pro XSS útoky.

  • Použili se pomocné třídy Html a Xml?
# rawElement() escapuje všechny hodnoty atributů
# (což v tomto případě poskytuje $myClass)
echo Html::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.
echo Html::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' ) {
    ...

Řetězce dotazů

Relace

Obavy recenzenta

  • 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'];
 	...

Dotazy SQL


Automatická kontrola

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.

Související odkazy

Poznámky pod čarou