i denne delen beskriver vi noen generelle prinsipper for å forhindre sårbarheter på tvers av nettsteder og måter å bruke ulike vanlige teknologier for å beskytte MOT xss-angrep.

Forebygging Av skripting på tvers av nettsteder kan generelt oppnås via to lag med forsvar:

  • Kode data på utgang
  • Validere inngang ved ankomst

Du kan bruke Burp Scanner for å skanne nettsteder for mange sikkerhetsproblemer inkludert XSS. Burps banebrytende skannelogikk replikerer handlingene til en dyktig angriper og er i stand til å oppnå tilsvarende høy dekning AV xss-sårbarheter. Du kan bruke Burp Scanner for å få forsikring om at forsvaret ditt mot XSS-angrep fungerer effektivt.

Kode data på utdata

Koding skal brukes direkte før brukerstyrbare data skrives til en side, fordi konteksten du skriver inn, bestemmer hvilken type koding du må bruke. For eksempel krever verdier i En JavaScript-streng en annen type rømmer til DE i EN HTML-kontekst.

i EN HTML-kontekst bør du konvertere ikke-hvitelistede verdier til HTML-enheter:

  • < konverterer til: &lt;
  • > konverterer til: &gt;

i En JavaScript – strengkontekst bør Ikke-alfanumeriske verdier Være Unicode-rømt:

  • < konverterer til: \u003c
  • > konverterer til: \u003e

Noen ganger må du bruke flere lag med koding, i riktig rekkefølge. For eksempel, for å trygt bygge inn brukerinngang i en hendelsesbehandler, må du håndtere Både JavaScript-konteksten og HTML-konteksten. Så du må Først Unicode-unnslippe inngangen, og DERETTER HTML-kode den:

<a href="#" onclick="x='This string needs two layers of escaping'">test</a>

Validere input ved ankomst

Koding er trolig DEN viktigste LINJEN I xss forsvar, men det er ikke tilstrekkelig til å hindre xss sårbarheter i alle sammenhenger. Du bør også validere innspill så strengt som mulig på det punktet når den først mottas fra en bruker.

Eksempler på input validering inkluderer:

  • hvis en bruker sender INN EN URL som vil bli returnert i svar, bekrefter du at DEN starter med en sikker protokoll som HTTP og HTTPS. Ellers kan noen utnytte nettstedet ditt med en skadelig protokoll som javascript eller data.
  • hvis en bruker leverer en verdi som den forventes å være numerisk, validere at verdien faktisk inneholder et heltall.
  • Validerer at inndata bare inneholder et forventet sett med tegn.

Inndatavalidering bør ideelt sett fungere ved å blokkere ugyldige inndata. En alternativ tilnærming, for å forsøke å rense ugyldig inndata for å gjøre det gyldig, er mer utsatt for feil og bør unngås der det er mulig.

Hvitelisting vs svartelisting

Inndatavalidering bør generelt bruke hvitelister i stedet for svartelister. For eksempel, i stedet for å prøve å lage en liste over alle skadelige protokoller (javascript, data, etc.), bare lage en liste over sikre protokoller (HTTP, HTTPS) og forby noe ikke på listen. Dette vil sikre at forsvaret ditt ikke bryter når nye skadelige protokoller vises, og gjør det mindre utsatt for angrep som forsøker å forvirre ugyldige verdier for å unngå en svarteliste.

Å Tillate» sikker » HTML

Slik at brukere kan legge INN HTML-markering, bør unngås der det er mulig, men noen ganger er det et forretningskrav. For eksempel kan en blogg tillate kommentarer som inneholder noen begrenset HTML markup.

den klassiske tilnærmingen er å prøve å filtrere ut potensielt skadelige koder og JavaScript. Du kan prøve å implementere dette ved hjelp av en hviteliste med sikre koder og attributter, men takket være uoverensstemmelser i nettlesermotorer og quirks som mutation XSS, er denne tilnærmingen ekstremt vanskelig å implementere sikkert.

det minst dårlige alternativet er å bruke Et JavaScript-bibliotek som utfører filtrering og koding i brukerens nettleser, for eksempel DOMPurify. Andre biblioteker tillater brukere å gi innhold i markdown format og konvertere markdown til HTML. Dessverre har ALLE disse bibliotekene xss sårbarheter fra TID til annen, så dette er ikke en perfekt løsning. Hvis du bruker en, bør du overvåke nøye for sikkerhetsoppdateringer.

Merk

i Tillegg Til JavaScript kan annet innhold som CSS og til og med vanlig HTML være skadelig i enkelte situasjoner.

Angrep ved hjelp av ondsinnet CSS

slik forhindrer DU XSS ved hjelp av en malmotor

Mange moderne nettsteder bruker malmotorer på serversiden som Twig og Freemarker for å legge inn dynamisk innhold i HTML. Disse definerer vanligvis sitt eget rømningssystem. I Twig kan du for eksempel bruke filteret e(), med et argument som definerer konteksten:

{{ user.firstname | e('html') }}

Noen andre mal motorer, Som Jinja Og React, unnslippe dynamisk innhold som standard som effektivt hindrer DE fleste forekomster AV XSS.

vi anbefaler å gjennomgå escaping-funksjoner nøye når du vurderer om du vil bruke en gitt malmotor eller rammeverk.

Merk

hvis du setter sammen brukerinndata direkte i malstrenger, vil du være sårbar for malinjeksjon på serversiden, som ofte er mer alvorlig ENN XSS.

slik forhindrer DU XSS i PHP

I PHP er det en innebygd funksjon for å kode enheter kalt htmlentities. Du bør ringe denne funksjonen for å unnslippe dine innspill når du er inne I EN HTML-kontekst. Funksjonen skal kalles med tre argumenter:

  • din inngangsstreng.
  • ENT_QUOTES, som er et flagg som angir at alle anførselstegn skal kodes.
  • tegnsettet, som i de fleste tilfeller skal være UTF-8.

for eksempel:

<?php echo htmlentities($input, ENT_QUOTES, 'UTF-8');?>

Når Du er I En JavaScript – strengkontekst, må Du Unicode-escape-inngang som allerede beskrevet. DESSVERRE GIR PHP ikke EN API Til Unicode-unnslippe en streng. Her er noen kode for å gjøre DET I PHP:

<?php

function jsEscape($str) {
$output = '';
$str = str_split($str);
for($i=0;$i<count($str);$i++) {
$chrNum = ord($str);
$chr = $str;
if($chrNum === 226) {
if(isset($str) && ord($str) === 128) {
if(isset($str) && ord($str) === 168) {
$output .= '\u2028';
$i += 2;
continue;
}
if(isset($str) && ord($str) === 169) {
$output .= '\u2029';
$i += 2;
continue;
}
}
}
switch($chr) {
case "'":
case '"':
case "\n";
case "\r";
case "&";
case "\";
case "<":
case ">":
$output .= sprintf("\u%04x", $chrNum);
break;
default:
$output .= $str;
break;
}
}
return $output;
}
?>

Slik bruker du jsEscape – funksjonen I PHP:

<script>x = '<?php echo jsEscape($_GET)?>';</script>

Alternativt kan du bruke en malmotor.

slik forhindrer DU XSS-klientsiden I JavaScript

for å unnslippe brukerinngang i EN HTML-kontekst i JavaScript, trenger Du din egen HTML-koder fordi JavaScript ikke gir EN API for å kode HTML. Her er noen Eksempel JavaScript-kode som konverterer en streng TIL HTML-enheter:

function htmlEncode(str){
return String(str).replace(//gi, function(c){
return '&#'+c.charCodeAt(0)+';';
});
}

Du vil da bruke denne funksjonen som følger:

<script>document.body.innerHTML = htmlEncode(untrustedValue)</script>

Hvis inngangen din er inne I En JavaScript-streng, trenger du En koder som utfører Unicode-escaping. Her er Et Eksempel Unicode-encoder:

function jsEscape(str){
return String(str).replace(//gi, function(c){
return '\u'+('0000'+c.charCodeAt(0).toString(16)).slice(-4);
});

}

Du vil da bruke denne funksjonen som følger:

<script>document.write('<script>x="'+jsEscape(untrustedValue)+'";<\/script>')</script>

slik forhindrer DU XSS i jQuery

den vanligste formen FOR XSS i jQuery er når du sender brukerinngang til en jquery-velger. Webutviklere vil ofte bruke location.hash og gi det til velgeren som ville forårsake XSS som jQuery ville gjengi HTML. jQuery anerkjente dette problemet og lappet sin selector logikk for å sjekke om innspill begynner med en hash. Nå vil jQuery bare gjengi HTML hvis det første tegnet er en <. Hvis du sender uklarerte data til jquery-velgeren, må du sørge for at du unngår verdien riktig ved hjelp av funksjonen jsEscape ovenfor.

Begrensning AV XSS ved hjelp av content security policy (CSP)

Content security policy (CSP) er den siste forsvarslinjen mot skripting på tvers av nettsteder. HVIS XSS-forebyggingen mislykkes, kan DU bruke CSP til å redusere XSS ved å begrense hva en angriper kan gjøre.

CSP lar deg kontrollere forskjellige ting, for eksempel om eksterne skript kan lastes inn og om innebygde skript skal kjøres. For å distribuere CSP må du inkludere ET HTTP-svarhode kalt Content-Security-Policy med en verdi som inneholder policyen din.

ET EKSEMPEL CSP er som følger:

default-src 'self'; script-src 'self'; object-src 'none'; frame-src 'none'; base-uri 'none';

denne policyen angir at ressurser som bilder og skript bare kan lastes fra samme opprinnelse som hovedsiden. Så selv om en angriper kan injisere EN XSS-nyttelast, kan de bare laste ressurser fra gjeldende opprinnelse. Dette reduserer sjansen for at en angriper kan utnytte xss-sårbarheten.

hvis du trenger lasting av eksterne ressurser, må du sørge for at du bare tillater skript som ikke hjelper en angriper til å utnytte nettstedet ditt. Hvis du for eksempel hvitelister bestemte domener, kan en angriper laste inn et hvilket som helst skript fra disse domenene. Der det er mulig, prøv å være vert for ressurser på ditt eget domene.

Hvis det ikke er mulig, kan du bruke hash-eller nonce-basert policy for å tillate skript på forskjellige domener. En nonce er en tilfeldig streng som legges til som et attributt for et skript eller en ressurs, som bare utføres hvis den tilfeldige strengen samsvarer med den servergenererte. En angriper kan ikke gjette den randomiserte strengen og kan derfor ikke starte et skript eller en ressurs med en gyldig nonce, og ressursen vil derfor ikke bli utført.

Redusere xss-angrep ved HJELP AV CSP

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.