Table of Contents
Johdatus Cross-Site Scripting (XSS) ja JavaScript Defenses
Cross-site scripting (XSS) on yksi yleisimmistä web-turvallisuuden haavoittuvuuksia, johdonmukaisesti sijoitus OWASP Top 10. XSS hyökkäys mahdollistaa hyökkääjä ruiskuttaa haittapuoli asiakas-side skriptit web-sivuille katsella muita käyttäjiä. Nämä skriptit voivat varastaa istuntopoletit, ohjata käyttäjät phishing sivustoja, deface sivut, tai asentaa haittaohjelmia. Vaikka palvelimen puolella sanitation on kriittinen, JavaScript on keskeinen rooli asiakkaan puolella havaita ja estää nämä hyökkäykset. Tämä artikkeli tarjoaa kattavan, tuotannon-ready opas käyttää JavaScript suojaamaan sovelluksia XSS.
Kolmen XSS-tyypin ymmärtäminen
Ennen sukellus ennaltaehkäisyyn, on tärkeää ymmärtää kolme ensisijaista XSS: tallentaa, heijastuu, ja DOM-pohjainen. Jokainen vaatii hieman erilainen havaitseminen ja ennaltaehkäisy lähestymistapa.
Säilytetty XSS
Tallennettuna (jatkuva) XSS tapahtuu, kun pahansuopa syöte tallennetaan pysyvästi palvelimelle (esim. tietokantaan, foorumipostiin tai kommenttiin) ja myöhemmin tarjotaan käyttäjille ilman asianmukaista manitisaatiota. Hyökkäyskuorma suorittaa selaimessa kenen tahansa katsomalla tallennettua sisältöä.
Heijastettu XSS
Heijastettu XSS tapahtuu, kun pahansuopa skripti heijastuu web-palvelimelta, tyypillisesti URL-parametrin tai muoto-anomuksen kautta. Hyökkääjä huijaa uhria klikkaamaan suunniteltua linkkiä, ja ruiskutettu koodi suorittaa välittömästi. Toisin kuin tallennettu XSS, hyötykuorma ei jatku.
DOM-perusteltu XSS
DOM-pohjainen XSS on puhtaasti asiakaspuolen haavoittuvuus. Hyökkäyskuorma muuttaa uhrin DOM-ympäristöä. Ilkeä koodi ei koskaan koske palvelimeen; se on peräisin asiakaspuoli JavaScriptistä, joka käsittelee turvallisesti käyttäjän syötettä (esim., lukeminen ], tai ).
Havaitaan XSS-hyökkäykset JavaScriptillä
Havaitsemisessa on kyse epäilyttävän toiminnan tunnistamisesta ennen kuin vahinko tapahtuu. JavaScript voi seurata käyttäjän syötteitä, seurata DOM-mutaatioita ja validoida tietoja ottopisteissä. Vaikka asiakaspuolen havaitseminen ei voi tavoittaa kaikkia hyökkäyksiä (erityisesti jos hyökkääjän käsityö vaatii suoraan palvelimelle), se tarjoaa arvokkaan ensimmäisen puolustuslinjan.
Syötevalidointi ja sanitointi
Vahvista ja puhdista käyttäjäsyötteet aina asiakaspuolella ennen käsittelyä. Käytä [ :n sijasta komentosarjan suorituksen estämiseksi. Seuraava toiminto poistaa vaaralliset merkit merkkijonosta:
function sanitizeInput(input) {
const div = document.createElement('div');
div.textContent = input;
return div.innerHTML;
}
Tämä toimii, koska asetus ei tulkitse HTML-tunnisteita; se käsittelee kaikkea tavallisena tekstinä. Tuloksena sisältää karanneita versioita kaikista HTML-erikoismerkeistä (esim. , , [[]).
DOM-mutaatioiden seuranta epäilyttävien elementtien varalta
Attackers usein injektoida tags tai tapahtuma käsittelijät ([], ) DOM. Käyttämällä API, voit seurata odottamattomia elementtejä sisään. Perusesimerkki:
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
mutation.addedNodes.forEach((node) => {
if (node.nodeType === 1) { // element node
if (node.tagName === 'SCRIPT') {
console.warn('Potential XSS: a script element was injected via DOM.');
node.remove(); // or log and analyze
}
// Check for dangerous attributes
if (node.hasAttribute('onerror') || node.hasAttribute('onload')) {
console.warn('Suspicious event handler attribute detected.');
}
}
});
});
});
observer.observe(document.body, { childList: true, subtree: true });
Varoitus:[] Estävät komentojonot kautta voidaan ohittaa nokkelilla hyökkääjillä ja ne voivat rikkoa laillista toiminnallisuutta. Käytä tätä valvontavälineenä eikä ensisijaisena estomekanismina.
Validoidaan URL- ja Hash-parametreja
DOM-pohjaisen XSS:n osalta lue URL-osoitteet turvallisesti käyttäen ja vältä suoraan arvojen lisäämistä HTML:ään.
const params = new URLSearchParams(window.location.search);
const userParam = params.get('name');
if (userParam && /[<>"'\/]/.test(userParam)) {
console.warn('Potential XSS in parameter: ' + userParam);
// Do not use this value in the DOM without encoding
}
XSS-hyökkäysten estäminen JavaScript-ohjelmalla
Ennaltaehkäisy edellyttää monikerroksista lähestymistapaa. JavaScript ei yksin voi täysin varmistaa sovellusta, mutta kun siihen yhdistetään asianmukainen taustakartoitus ja Content Security Policy (CSP)[], se vähentää riskiä dramaattisesti.
Koodaa kaikki käyttäjän ohjaamat tiedot ennen kuin lisäät ne kotipesään
Kultainen sääntö: älä koskaan lisää luottamatonta tietoa suoraan DOM:iin. Käytä turvallisia DOM-menetelmiä sisäisen HTML:n sijaan.
Käyttö tai
const userInput = getUserInput();
const safeText = document.createTextNode(userInput);
document.getElementById('output').appendChild(safeText);
Kun sinun täytyy käyttää , siivoa kirjaston kanssa
Jos sinun täytyy ehdottomasti tehdä HTML (esim., rikas tekstieditori), luottaa luotettu manitisaatiokirjasto kuten DOMPurify. DOMPurify on laajalti käytetty, taistelu-testattu kirjasto, joka poistaa pahansuopa koodi säilyttäen samalla turvallinen HTML.
// Example with DOMPurify (install via npm or CDN)
const dirty = '<img src=x onerror="alert(1)">';
const clean = DOMPurify.sanitize(dirty);
document.getElementById('content').innerHTML = clean;
DOMPurify teoksia jäsentämällä syöte, strippaamalla vaarallisia tunnisteita ja ominaisuuksia, ja palauttamalla vain sallittuja elementtejä. [Näytä DOMPurify on GitHub.
Vältä vaarallisia JavaScript- toimintoja
Jotkut JavaScript-menetelmät ja ominaisuudet ovat tunnettuja XSS:n mahdollistamisesta. Vältä tai tarkasti kontrolloi:
- [] .
- , [] .
- [[] .
- [[ ] .] ...................................................................................................................................................................................................................................
- / merkkijonokoodilla .
- ][ ] rakennuttaja . . .
Toteuttaa Sisällön turvallisuuspolitiikka (CSP) JavaScript? Ei suositella
CSP on selainmekanismi, joka rajoittaa mitä skriptejä voi suorittaa. Se on tyypillisesti asetettu HTTP-otsikkojen kautta, mutta voit myös asettaa sen käyttämällä [ tagia tai JavaScript-ohjelmaa dynaamisesti luomalla -elementtiä. Kuitenkin CSP:n asettaminen JavaScript-osioon on vähemmän turvallista, koska hyökkääjä, jolla on jo jokin hallinta, voi poistaa sen käytöstä. Jos sinun täytyy käyttää JavaScript-ohjelmaa CSP:n täytäntöönpanoon (esim. kehityksen aikana), tee se hyvin aikaisin sivun latauksessa:
const meta = document.createElement('meta');
meta.httpEquiv = 'Content-Security-Policy';
meta.content = "default-src 'self'; script-src 'self' 'unsafe-inline'"; // Be very careful with 'unsafe-inline'
document.head.appendChild(meta);
Tuotannossa, määritä CSP web-palvelimella tai käänteisproxy. [MDN CSP dokumentaatio[ tarjoaa kattavat ohjeet.
Lisäturvatoimenpiteet
JavaScript-erityisen taktiikan lisäksi XSS:n kokonaisen ehkäisystrategian piiriin kuuluvat seuraavat kriittiset toimenpiteet:
- Aina validoida palvelimen puolella.[ Asiakaspuolen validointi voidaan ohittaa. Älä koskaan luota asiakastietoihin.
- ]Käytä asianmukaisia HTTP-vastausotsikoita.[ , ja erityisesti .
- Output encode every time crease user data.[ Kontekstiasiat: koodaa HTML-yhteisöille, URL-koodaus, JavaScript-jonon koodaus jne.
- Pidä riippuvuussuhteet ajan tasalla.[ Haavoittuvia JavaScript-kirjastoja (esim. vanhoja versioita jQuerystä) käytetään yleisesti XSS-vektorina.
- Käytä kehyksiä sisäänrakennetulla XSS-suojauksella.[ Reaktio, kulma ja vue automaattisesti poistuvat lähdöstä oletusarvoisesti. Ole silti varovainen :n tai :n kanssa.
- Täytä tiukka CSP.[] Vältä ja , jos mahdollista. Käytä nonces tai hashes inline skriptejä.
Real-World Esimerkki: Turvallinen kommentti Renderöinti
Harkitse blogikommenttijärjestelmää, jossa käyttäjät lähettävät viestejä, jotka näytetään muille. Hyökkääjä saattaa yrittää lisätä . Tässä on JavaScript-lähestymistapa, joka integroituu taustaosaan:
- Ennen kuin lähetät palvelimelle [], puhdistaudu [ ennen kuin lähetät sen (mutta palvelimen on edelleen sanitoitava).
- Server palauttaa tiedot:[ Taustaosan tulisi HTML- koodata kommenttiteksti.
- Asiakasntositteet:[] Käytä tai turvallista mallikonetta. Älä koskaan käytä raakaa käyttäjätietoa.
function renderComment(comment) {
const item = document.createElement('div');
item.className = 'comment';
const body = document.createElement('p');
body.textContent = comment.body; // escaped by browser
item.appendChild(body);
document.getElementById('comments').appendChild(item);
}
Puolustusten testaaminen
Kun olet toteuttanut ennaltaehkäisyn, testaa sovelluksesi käyttämällä automaattisia skannereita ja käsikäyttöisiä hyötykuormat.
- [[LLT:50]]
- [[LLT:51]]
- [[LLT:53]]
Käytä selaimen kehittäjä työkaluja tutkia DOM ja varmistaa hyötykuormat karannut. Myös, testaa CSP täytäntöönpanon tarkistamalla konsolin rikkomusraportteja.
Päätelmät
Skripti on edelleen vakava uhka, mutta JavaScript tarjoaa tehokkaita työkaluja sekä havaitsemiseen että ennaltaehkäisyyn. Validoimalla syötteitä, seuraamalla DOM-muutoksia, karkaamalla tulostusta ja integroimalla vankkoihin kirjastoihin, kuten DOMPurify, voit merkittävästi kovettaa asiakaspuolesi turvallisuutta. Muista, että asiakaspuolen toimenpiteet eivät ole hopealuoti; ne täydentävät puolustus-in-syvällinen strategia, joka sisältää palvelinpuolen sanitointi, CSP-otsakkeet ja säännölliset tietoturvatarkastukset. Pysy valppaana, testaa usein ja pidä kirjastosi ajan tasalla.
Lisätietoja saa ]WASP XSS-sivulta ja WASP XSS-ennaltaehkäisylehdeltä .