Jak zabránit útokům skriptování mezi weby?

co je prevence skriptování mezi weby?

Cross-site scripting prevention je proces detekce a nápravy zranitelností XSS na vašich webových stránkách nebo webových aplikacích před tím, než se dostanou do výroby. Detekci zranitelností XSS lze provést automaticky pomocí automatizovaného skeneru zranitelnosti nebo ručně provedením penetračních testů. V tomto článku se dozvíte osvědčené postupy pro prevenci skriptování mezi weby a jak je můžete okamžitě implementovat. Na konci článku najdete také odkaz na bezplatný skener zranitelností zaměřený na vývojáře, takže můžete začít detekovat a opravovat zranitelnosti skriptování mezi weby brzy a často, jako součást vašich vývojových potrubí

v tomto článku se dozvíte:

  • co je prevence skriptování mezi weby?
  • jak funguje skriptování mezi weby?
  • jaké jsou typy útoků XSS?
  • jak důležitá je prevence skriptování mezi weby?
  • Cross Site scripting protection
    • Escape dynamic content
    • Whitelist hodnoty
    • implementujte zásady zabezpečení obsahu
    • dezinfikujte HTML
    • HTTP-only Cookies
  • XSS prevence s příklady kódu
    • prevence skriptování mezi weby v Pythonu (Django)
    • prevence skriptování mezi weby v Ruby (Rails)
    • prevence skriptování mezi weby v Javě (stránky serveru Java)
    • prevence skriptování mezi weby v C# (ASP.NET)
    • prevence skriptování mezi weby v uzlu
      • knír.js
      • prach.js
      • Nunjucks
    • prevence skriptování mezi weby v PHP
    • prevence skriptování mezi weby v AngularJS
    • prevence skriptování mezi weby v React
  • jak mohou automatizované nástroje pomoci zabránit skriptování mezi weby?

jak funguje skriptování mezi weby?

Cross-Site Scripting (XSS) útoky jsou formou injekčního útoku, kdy jsou škodlivé skripty injektovány do důvěryhodných webových aplikací.

jak funguje Cross Site scripting diagram

útočník může použít webovou aplikaci k odeslání škodlivého kódu, obvykle ve formě skriptu na straně prohlížeče, jinému koncovému uživateli, což má za následek útok XSS.

chyby zabezpečení XSS jsou velmi časté, vyskytují se tam, kde webová aplikace používá vstup od platného uživatele obsaženého v generovaném výstupu, ale bez odpovídající validace nebo kódování.

se škodlivým skriptem odeslaným uživateli jejich prohlížeč není schopen kategoricky vědět, že skript by neměl být důvěryhodný, a následně skript provede. Tento skript pak může přistupovat k velkému množství dat, včetně jakýchkoli souborů cookie, tokenů relace nebo jiných citlivých informací, které mohou být uchovávány prohlížečem pro daný web.

jaké jsou typy útoků XSS?

existují tři hlavní typy útoků XSS:

  1. odráží XSS: škodlivý skript pochází z aktuálního požadavku HTTP
  2. uloženého XSS: škodlivý skript pochází z databáze webových stránek
  3. XSS založené na DOM: kde chyba zabezpečení existuje spíše v kódu na straně klienta než na straně serveru.

jak důležitá je prevence skriptování mezi weby?

poškození způsobené zneužitím zranitelnosti XSS závisí na citlivosti dat, která váš web zpracovává. Zde je několik příkladů, kdy hackeři využívali zranitelné aplikace XSS:

  • šíření červů na sociálních médiích: Facebook, Twitter a YouTube byly tímto způsobem úspěšně napadeny.
  • únos relace: Škodlivý JavaScript může být schopen odeslat ID relace na vzdálený web pod kontrolou hackera, což hackerovi umožňuje vydávat se za tohoto uživatele únosem probíhající relace.
  • krádež Identity: pokud uživatel zadá důvěrné informace, jako jsou čísla kreditních karet, na ohroženou webovou stránku, mohou být tyto údaje ukradeny pomocí škodlivého JavaScriptu.
  • útoky odmítnutí služby a vandalismus webových stránek.
  • krádež citlivých dat, jako jsou hesla.
  • finanční podvody na bankovních stránkách.

Cross-site scripting protection

Escape dynamic content

obvykle, když je webová stránka vykreslena, dynamický obsah je tkaný do HTML. Pokud je dynamický obsah nesprávně zpracován, útočník jej může použít k vytvoření uloženého útoku XSS. Útočník by zneužil upravitelné pole vložením škodlivého kódu JavaScript, který je vyhodnocen v prohlížeči, když jiný uživatel navštíví tuto stránku.

možná nebudete chtít, aby uživatelé vytvářeli raw HTML, pokud váš web není systémem pro správu obsahu. Unikněte veškerému dynamickému obsahu pocházejícímu z datového úložiště, takže prohlížeč ví, že je třeba s ním zacházet jako s obsahem značek HTML, na rozdíl od raw HTML.

escapování dynamického obsahu obecně spočívá v nahrazení významných znaků kódováním entity HTML:

“ &#34
# &#35
& &#38
‚ &#39
( &#40
) &#41
/ &#47
; &#59
< &#60
> &#62

jak uvidíte v ukázkách kódu níže, většina moderních rámců ve výchozím nastavení unikne dynamickému obsahu.

únikem upravitelného obsahu tímto způsobem nebude obsah prohlížečem nikdy považován za spustitelný kód. Tím se zabrání většině útoků XSS.

Whitelist hodnoty

pokud dynamická datová položka může mít pouze několik platných hodnot, omezte hodnoty v datovém úložišti. Také se ujistěte, že vaše renderovací logika povoluje pouze známé správné hodnoty.

příkladem, kde budete chtít použít tento přístup, je požádat uživatele, aby vybral svou zemi z rozevíracího seznamu, místo toho, aby ji zadal ručně.

implementujte zásady zabezpečení obsahu

moderní prohlížeče podporují zásady zabezpečení obsahu. Zásady zabezpečení obsahu umožňují autorovi webové stránky řídit, odkud lze načíst a spustit JavaScript a další zdroje.

aby byl útok XSS možný, musí být útočník schopen spouštět škodlivé skripty na webové stránce uživatele-buď vložením vložených značek <script> někde v tagu <html> stránky, nebo podvedením prohlížeče do načtení JavaScriptu ze Škodlivé domény třetí strany.

nastavení zásad zabezpečení obsahu v záhlaví odpovědi vám umožní sdělit prohlížeči, aby nikdy nespouštěl inline JavaScript, a vybrat domény, které mohou hostovat JavaScript pro stránku:

Content-Security-Policy: script-src 'self' https://apis.google.com
povolením seznamu adres URL, ze kterých lze skripty načíst, implicitně prohlašujete, že inline JavaScript není povolen.

zásady zabezpečení obsahu můžete také umístit do značky <meta> v prvku <head> stránky:

<meta http-equiv="Content-Security-Policy" content="script-scr 'self' https://apis.google.com">

tento přístup je velmi účinný při ochraně vašich uživatelů, ale vyžaduje disciplínu, aby byl váš web připraven na takovou hlavičku. I když mají inline skripty je považován za špatnou praxi v moderním web-vývoj, jsou běžné ve starších, starší weby.

Chcete-li postupně migrovat z inline skriptů, zvažte použití zpráv o porušení CSP. Přidáním směrnice report-uri do záhlaví zásad vás prohlížeč upozorní na jakékoli porušení zásad, místo aby zabránil spuštění inline JavaScriptu:

Content-Security-Policy-Report-Only: script-src 'self'; report-uri http://example.com/csr-reports

to vám dá ujištění, že neexistují žádné přetrvávající inline skripty, než je úplně zakážete.

dezinfikujte HTML

u některých webů existuje legitimní potřeba ukládat a vykreslovat raw HTML. Pokud váš web ukládá a vykresluje bohatý obsah, musíte použít knihovnu dezinfekce HTML, abyste zajistili, že uživatelé se zlými úmysly nemohou do svých příspěvků HTML vkládat skripty.

HTTP-only Cookies

škodlivý JavaScript může být použit k odcizení souboru cookie obsahujícího ID relace uživatele. Zřídka existuje dobrý důvod číst nebo manipulovat s cookies v JavaScriptu na straně klienta, proto zvažte označení cookies pouze jako HTTP, což znamená, že cookies budou přijímány, ukládány a odesílány prohlížečem,ale nemohou být změněny nebo přečteny JavaScriptem.

prevence XSS s příklady kódu

prevence skriptování mezi weby v Pythonu (Django)

šablony v Django escape HTML ve výchozím nastavení, takže vše, co vypadá jako následující, je obecně bezpečné:

**{{ contents }}**

únik můžete přepsat pomocí filtru / safe. Tam jsou často dobré důvody k tomu, ale budete muset provést kontrolu kódu na cokoliv, co používá tento příkaz:

**{{ contents | safe }}**

Všimněte si, že HTML-escaping lze také zapnout nebo vypnout pomocí značky {% autoescape %}.

prevence skriptování mezi weby v Ruby (Rails)

šablony Rails ve výchozím nastavení unikají HTML, takže vše, co vypadá jako následující, je obecně bezpečné:

<%= contents %>

escape můžete přepsat pomocí funkce raw nebo pomocí operátoru <%==. Tam jsou často dobré důvody k tomu, ale budete muset provést kontrolu kódu na cokoliv, co používá tyto funkce:

<% raw contents %>

<%== contents %>

prevence skriptování mezi weby v Javě (stránky Java serveru)

použijte značku c:out k bezpečnému úniku z HTML:

<c:out value="${contents}">

následující způsoby zápisu do šablony neuniknou HTML, takže byste je měli používat opatrně:

<%= contents %>

${contents}

<%
out.println(contents);
%>

prevence skriptování mezi weby v C# (ASP.NET)

použijte některou z následujících funkcí k bezpečnému úniku z HTML (formulář <%: byl zaveden v ASP.NET 4.0):

<%= HttpUtility.HtmlEncode(contents) %>

<%: contents %>

následující způsob zápisu do šablony neunikne HTML automaticky, takže byste je měli používat opatrně:

<%= contents %>

použijte HttpUtility.HtmlEncode(...), pokud potřebujete ručně uniknout HTML.

prevence skriptování mezi weby v uzlu

knír.js

v kníru.js, všechny značky ve dvojitých knírech automaticky uniknou HTML:

{{ contents }}

mějte na paměti, že značky v trojitých knírech neunikají HTML, proto je používejte opatrně:

{{{ contents }}}

prach.js

klíčové značky automaticky uniknou HTML:

{ contents }

escaping však lze deaktivovat operátorem |s, proto jej používejte opatrně

{ contents | s }

Nunjucks

pokud je v prostředí zapnuto automatické escapování, Nunjucks automaticky uniknou značkám pro bezpečný výstup:

{{ contents }}

obsah označený bezpečným filtrem nebude unikat – tuto funkci používejte opatrně:

{{ contents | safe }}

Auto-escaping může být pro šablonu zakázán, v takovém případě je třeba značky uniknout ručně:

{{ contents | escape }}

prevence skriptování mezi weby v PHP

příkaz echo v PHP ve výchozím nastavení neunikne HTML, což znamená, že jakýkoli kód, jako je následující, který vytáhne data přímo z požadavku HTTP, je zranitelný vůči útokům XSS:

<?php
Echo $_POST;
?>

prevence skriptování mezi weby v AngularJS

jakýkoli obsah napsaný v složených závorkách bude automaticky uniknut, takže následující je bezpečné:

<div>{{dynamicContent}}</div>

mějte na paměti, že žádný kód, který váže dynamický obsah k atributu innerHTML, nebude automaticky uniknut:

<div ="dynamicContent"></div>
<div innerHTML]="{{dynamicContent}}"></div>

Cross-site scripting prevention in React

jakýkoli dynamický obsah napsaný v složených závorkách bude v React automaticky uniknut, takže následující kód je Bezpečný:

render() {
return <div>{dynamicContent}</div>
}

můžete také napsat raw HTML vazbou obsahu na vlastnost dangerouslySetInnerHTML. Název není náhoda, takže dávejte pozor na jakýkoli kód, který vypadá následovně:

render() {
return <div dangerouslySetInnerHTML={ __html: dynamicContent } />
}

jak mohou automatizované nástroje pomoci zabránit skriptování mezi weby?

jak bylo uvedeno výše, prevence skriptovacích útoků mezi weby může být snadná, přičemž mnoho rámců ve výchozím nastavení uniká dynamickému obsahu. Toto pohodlí však může vést k neúmyslnosti a některým vážným bezpečnostním slabostem vaší aplikace a vašeho podnikání.
vždy se ujistěte, že skenujete zranitelnosti aplikací před jejich uvolněním do výroby, ideálně jako součást potrubí DevOps a CI / CD, abyste včas odhalili a napravili chyby zabezpečení při každém sestavení / odevzdání.

můžete začít automatizovat své bezpečnostní testování dnes s dynamickým testovacím skenerem NeuraLegion, Nexploit. Postaveno pro vývojáře a bez falešných pozitiv, můžete jej integrovat do svých potrubí, abyste posunuli testování zabezpečení doleva a byli bezpečně navrženi.
Přihlašte se ke svému účtu zdarma zde: https://nexploit.app/signup

Leave a Reply

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.