XSS na bázi DOM

This page is a translated version of the page DOM-based XSS and the translation is 100% complete.

O XSS založeném na DOM

XSS na bázi DOM (nebo XSS typu 0) je typ útoku Skriptování napříč weby , ke kterému dochází, když skripty na straně klienta (jako je JavaScript) manipulují s DOM (Document Object Model) stránky a umožňují útočníkovi spustit JavaScript v prohlížeči oběti.

Tato třída XSS se liší od Reflective XSS (XSS typu 1) a Stored XSS (XSS typu 2), protože server nevrátí do prohlížeče spustitelný JavaScript. Místo toho jsou data, která byla vyčištěna serverem nebo možná nikdy na server odeslána, převedena na spustitelný JavaScript pomocí existujícího kódu spuštěného na stránce.

Zvažte například tento příklad skriptu z webové stránky OWASP:

...
Vyberte svůj jazyk:
<select><script>
document.write("<OPTION value=1>"+document.location.href.substring(document.location.href.indexOf("default=")+8)+"</OPTION>");
document.write("<OPTION value=2>English</OPTION>");
</script></select>
...

Pokud je stránka načtena s parametrem 'default' nastaveným na '<script>alert("xss")</script>' namísto zamýšleného jazykového řetězce, bude dodatečný skript přidán do DOM stránky a bude spuštěn při načítání stránky.

Prevence

Ačkoli JavaScript lze přidat na stránky MediaWiki bez formálního procesu kontroly kódu, mohou tyto skripty ohrozit ostatní uživatele, pokud těmto útokům nezabrání.

Stejně jako u standardní XSS prevence byste měli ověřovat data, která přicházejí, když je to možné, a vždy je escapovat, když váš skript zapisuje na stránku. Chcete-li provést toto escapování, měli byste se vyhnout používání některých metod, které escapování znesnadňují, a místo toho používat metody, které usnadňují oddělení struktury HTML a hodnot nebo textu.

Může být lákavé používat datové atributy k poskytování informací pro javascript. To je obecně dobrá praxe, ale nezapomeňte, že uživatelé mohou vytvářet prvky také s libovolnými datovými atributy, takže veškeré informace převzaté z datového atributu (např. pomocí jQuery .data()) by měly být považovány za nedůvěryhodný vstup a měly by být ověřeny.

Vyhněte se

Obecně je třeba se těmto funkcím pokud možno vyhnout. Lze je zabezpečit, ale vyžadují pochopení toho, jak funguje zdroj JavaScript každého prohlížeče, aby bylo zajištěno, že všechny vektory XSS byly zmírněny.

Elementem jsou metody .innerHTML() a .outerHTML()

element.innerHTML = '<div>' + user-data + '</div>';

Metoda JQuery .html() (která používá .innerHTML)

$('#target').html( user-data );

Použití uživatelských dat při vytváření prvků jQuery

$( '<div id=' + user-data + '></div>' );

Metoda jQuery append, když si nejste jisti typem a hodnotou každého uzlu nebo objektu, který připojujete. Pokud se jedná o řetězec (zdánlivého) HTML, jQuery jej implicitně převede na prvek.

document.write() nebo document.writeln()

document.write( 'Welcome to ' + user-data + '!' );

Používání uživatelských dat v řetězci předávaném eval, setTimeout, obslužné rutině události objektu nebo javascript: cílům URL

Použití uživatelských dat v řetězcích, které generují CSS

Použití

Při aktualizaci DOM stránky byste měli obvykle použít tento vzor funkcí pro vytváření prvků DOM a jejich vkládání do DOM:

var $el = $('<div>');
$el.attr( {
  anAttribute: 'aValue',
  anotherAttribute: 'anotherValue'
} );
$el.text( 'Text of the div' );
$parent.append( $el );

Jak je znázorněno, můžete použít $('<tagName>') k vytvoření prvku a jakýchkoli atributů, které nezahrnují data kontrolovaná uživatelem. Můžete také použít .attr() k nastavení atributů prvku.

Když máte správně zkonstruovaný prvek, můžete použít .append() nebo .appendTo k vložení prvku do DOM. Ale podívejte se nahoru. Nepoužívejte append() nebo appendTo(), pokud přesně nevíte, co připojujete.

Metodu .text() lze použít k nastavení textového těla prvku a správně escapuje každé HTML.

Pokud nepoužíváte jQuery, můžete použít

var element = document.createElement( "tagName" );
element.setAttribute( "attributeName", "value" );
element.appendChild( child );

Protože JavaScript je schopen jasně interpretovat, jaké řetězce mají reprezentovat názvy prvků, názvy atributů a hodnoty atributů, správně escapují všechny znaky HTML, které mohly být vloženy do uživatelsky řízených dat.

Sanitace

Mohou nastat situace, kdy budete muset smíchat uživatelsky řízená data s HTML. V těchto případech se budete muset ujistit, že data kontrolovaná uživatelem jsou správně escapována pro kontext HTML, do kterého se vkládají.

Například vkládání dat do textu prvku div:

<div>User-Controlled Data</div>

Vyžaduje jiné escapování, než když vložíte uživatelsky řízená data do atributu ID prvku div.

Seznam kontextů a pravidel escapování lze nalézt v OWASP XSS Prevention Cheat Sheet

Pro nejjednodušší případ (vložení uživatelem řízených dat do textu prvku) můžete použít metodu .text nebo mw.html.escape() jQuery.