Skriptování napříč weby

This page is a translated version of the page Cross-site scripting and the translation is 100% complete.

Cross-site scripting, XSS nebo arbitrary JavaScript injection je typ zranitelnosti zabezpečení počítače, který se obvykle vyskytuje ve webových aplikacích a umožňuje útočníkům vkládat script na straně klienta na webové stránky prohlížené ostatními uživateli.

Informace o skriptování mezi weby na straně klienta a o tom, jak mu zabránit, naleznete v části XSS na bázi DOM .

Příklady

Příklady skriptování napříč weby:

  • Útočník přiměje ověřeného uživatele k návštěvě speciálně vytvořené adresy URL nebo webové stránky, kterou ovládá a která jej může přesměrovat na vytvořenou adresu URL.
  • Adresa URL odkazuje na vaši webovou aplikaci a obsahuje JavaScript v řetězci dotazu. Webová aplikace kvůli špatnému escapingu vkládá libovolný JavaScript do stránky, která se zobrazí uživateli.
  • JavaScript běží s plným přístupem k cookies uživatele. Může stránku jakýmkoli způsobem upravovat a může odesílat formuláře jménem uživatele. Rizika jsou zvláště závažná, pokud je obětí správce se zvláštními oprávněními.

Další příklady viz Příklady využití na Wikipedii.

Příklad:

function getTableCell( $out, $value ) {
    $request = $out->getRequest();
    $class = $request->getVal( 'class' );
    return "<td class='$class'>" . htmlspecialchars( $value ) . '</td>';
}

Útočník pošle oběť na adresu URL, jako je:

http://example.com/wiki/SomePage?class='%20><script>hack();</script></td><td%20class='

Požadavky POST jsou také zranitelné, protože používají JavaScript mimo web.

Oběti ani nemusí přímo navštívit stránku, aby byly ovlivněny. Škodlivé weby třetích stran mohou do vytvořených adres URL vkládat skryté prvky iframe, aby napadly uživatele při návštěvě jejich webu. Stejně tak mohou být podvedeni k návštěvě škodlivé nebo vytvořené adresy URL pomocí služeb krátkých adres URL nebo maskování adresy URL za jinou.

Zastavení skriptování napříč weby

Chcete-li se vyhnout skriptování mezi weby, proveďte následující:

  • Ověřte svůj vstup
  • Escapujte svůj výstup

Můžete přeskočit ověření, ale nikdy nemůžete přeskočit escapování. Vše escapujte.

Nezáleží na tom, zda je escape s ověřením nadbytečný, náklady na výkon jsou malou cenou, kterou je třeba zaplatit výměnou za prokazatelně bezpečnou webovou aplikaci. Nezáleží na tom, zda vstup pochází z důvěryhodného zdroje, escapování je nutné i tehdy, protože escapování vám dává správnost i bezpečnost.

Escapujte co nejblíže k výstupu, aby si recenzent mohl snadno ověřit, že to bylo provedeno. Pomůže vám také ověřit váš vlastní kód.

Výstupní kódování (escapování) je kontextově citlivé. Buďte si tedy vědomi zamýšleného výstupního kontextu a vhodně kódujte (např. HTML entita, URL, JavaScript atd.)

Cheat Sheet Zkrácený XSS prevence OWASP je užitečný a aktuální rychlý referenční průvodce pro zmírnění problémů s XSS.

To vše platí pro jakýkoli textový formát výměny. Soustředíme se na HTML, protože webové aplikace toho mají tendenci generovat hodně a protože bezpečnostní problémy jsou obzvlášť závažné. Každý textový formát by měl mít dobře prostudovanou funkci escapování.

Zde je několik užitečných funkcí, které pro váš web escapují HTML.

Formát Funkce escapování Poznámky
HTML htmlspecialchars( $string, ENT_QUOTES ) Vždy používejte příznak ENT_QUOTES, který převádí dvojité i jednoduché uvozovky. PHP má bohužel ve výchozím nastavení "escape pouze jednoduché uvozovky".[1]
XML ID Sanitizer::escapeId() Pro atributy ID v HTML
Style Sanitizer::checkCss() Pro atributy stylu v HTML
JavaScript FormatJson::encode(), Xml::encodeJsVar()
Parametry URL wfArrayToCgi(), urlencode()
SQL $db->addQuotes()

Výstup escape MediaWiki

MediaWiki má také několik elegantních vestavěných rozhraní, která implicitně escapují váš výstup. Pro SQL pomocí 'key' => 'value' syntaxe podmínek implicitně escapuje hodnoty. A metody rozhraní Html:: a Xml:: escape atributy a v závislosti na použité metodě mohou escapovat i textové hodnotě.

Externí odkazy

  • Escaping, w3.org. Velmi dobře napsaná definice escapování.

Poznámky pod čarou