Bevitel validálása, tisztítása és az injekciós támadások megelőzése

Tudd meg, hogyan védi a bevitel validálása és tisztítása az űrlapokat az injekciós támadásoktól, és mitől lesznek biztonságosak az űrlapadatok.

Piszkozat

Amikor a támadók űrlapokat vesznek célba, nem úgy töltik ki őket, mint egy normális látogató. Olyan kódot küldenek, amelyet arra terveztek, hogy betörjön a rendszereidbe, vagy adatokat lopjon. Küldhetnek JavaScriptet, amely a látogatók böngészőjében fut le, SQL-parancsokat, amelyek tönkreteszik az adatbázisodat, vagy rosszindulatú tartalmat, amely kárt okoz. A bevitel validálása és tisztítása az a védelem, amely megállítja ezeket a támadásokat.

Mit fogsz megtanulni: mi a bevitel validálása és tisztítása, miben különböznek, hogyan működnek az injekciós támadások, mely védelmek működnek a különböző adattípusoknál, és hogyan vezesd be őket az űrlapjaidon.

Mi a bevitel validálása?

A bevitel validálása annak ellenőrzése, hogy az űrlapodra beküldött adat a várt formátumú-e, és megfelel-e a követelményeidnek. Ez az első védelmi vonal a rosszindulatú bevitel ellen.

A validálás olyan kérdésekre válaszol, mint hogy ez e-mail-cím vagy véletlenszerű szöveg, szám vagy szó, üres-e a mező, amikor nem lenne szabad, és hogy a látogató olyat írt-e be, ami értelmes ebben a mezőben, vagy olyat, ami gyanús.

Példák arra, mit ellenőriz a validálás:

  • Egy e-mail mezőnek tartalmaznia kell egy @ jelet és egy domaint
  • Egy telefonszám mező csak számjegyeket és kötőjeleket tartalmazhat
  • Egy szám mező nem tartalmazhat betűket
  • Egy kötelező mező nem lehet üres
  • Egy jelszó mezőnek meg kell felelnie a minimális hosszúsági követelménynek

A validálás két helyen történik. A látogató eszközén ezt kliensoldali validálásnak hívjuk. A szervereden szerveroldali validálásnak. A kliensoldali validálás azonnali visszajelzést ad a látogatóknak, ha hibáznak. A szerveroldali validálás az, ami valóban véd a támadások ellen, mert a támadók ki tudják kerülni a kliensoldali ellenőrzéseket.

Mi a bevitel tisztítása?

A tisztítás az a folyamat, amelyben eltávolítod vagy ártalmatlanítod a felhasználói bevitelből mindazt, ami veszélyes, mielőtt eltárolnád vagy feldolgoznád. Még ha az adat át is megy a validáláson, tartalmazhat olyan kódot vagy karaktereket, amelyeket kárt okozni terveztek.

Példák arra, mit csinál a tisztítás:

  • Eltávolítja a HTML-címkéket, például a `<script>` és az `<img>` elemeket a szövegmezőkből
  • Eltávolítja azokat az SQL-különleges karaktereket, amelyekkel be lehet törni az adatbázisokba
  • Escape-eli a különleges karaktereket, hogy szövegként kezeljék őket, ne kódként
  • Korlátozza a bevitel hosszát, hogy megelőzze a puffertúlcsordulásos támadásokat

A validálás és a tisztítás együtt dolgozik, de más célt szolgál. A validálás azt ellenőrzi, hogy az adat a megfelelő formátumú-e. A tisztítás eltávolít mindent, ami veszélyes, még ha a formátum technikailag helyes is.

Hogyan működnek az injekciós támadások

SQL injekció

SQL injekciós támadás akkor történik, amikor a támadó SQL-kódot ír egy űrlapmezőbe. Ha az űrlapod kódja nem tisztítja meg ezt a bevitelt, az SQL-kód lefut az adatbázisodon.

Példa: Egy bejelentkezési űrlap e-mail-címet kér. Az e-mail-cím helyett a támadó ezt küldi be:

' OR '1'='1

Ha az űrlapod ezt nem tisztítja meg, a kódod olyan SQL-lekérdezést futtathat, amely így néz ki:

SELECT * FROM users WHERE email = '' OR '1'='1'

Az `OR '1'='1'` rész miatt a feltétel mindig igaz, így a lekérdezés az összes felhasználót visszaadja, nem csak azt, akinek ez az e-mail-címe. A támadó így kijátszotta a bejelentkezési rendszert.

Cross-Site Scripting (XSS)

XSS-támadás akkor történik, amikor a támadó JavaScript-kódot küld be egy űrlapmezőben. Ha az űrlap nem tisztítja meg ezt a kódot, és eltárolja, a JavaScript lefut mindenki böngészőjében, aki később megnézi azt az adatot.

Példa: Egy hozzászólás-űrlap felhasználói hozzászólásokat fogad. A támadó ezt küldi be:

<script>alert('hacked')</script>

Ha ezt nem tisztítják meg, és az adatbázisban tárolják, akkor bárki, aki megnézi a hozzászólások részt, azt látja, hogy a JavaScript lefut, és figyelmeztetést jelenít meg. Egy veszélyesebb változat sütiket lophat, adathalász oldalra irányíthatja a látogatókat, vagy kinyerheti az űrlapadatokat.

Parancsinjekció

Ha az űrlapadataidat rendszerparancsokban használják (ez egyes háttérrendszerekben megtörténik), a támadó operációs rendszer szintű parancsokat injektálhat.

Példa: Egy űrlapmezőt a következőhöz hasonló parancsban használnak:

ffmpeg -i $filename output.mp4

Ha a `$filename` nincs megtisztítva, és a támadó a `;rm -rf /` értéket küldi be, a parancs ez lesz:

ffmpeg -i ;rm -rf / output.mp4

Az `rm -rf /` parancs lefut, és fájlokat töröl a rendszerről. Ezért a rendszerparancsok soha nem kaphatnak megtisztítatlan felhasználói bevitelt.

Validálás és tisztítás különböző adattípusoknál

E-mail-címek

Validálás: Ellenőrizd, hogy a bevitel megfelel-e egy e-mail mintának (valami olyasmi, mint szoveg@domain.kiterjesztes). Győződj meg róla, hogy csak megengedett karaktereket tartalmaz.

Tisztítás: Távolíts el minden HTML-címkét és különleges karaktert. Csak az alfanumerikus karaktereket, pontokat, kötőjeleket és a @ jelet tartsd meg.

Telefonszámok

Validálás: Ellenőrizd, hogy csak számjegyeket, kötőjeleket, zárójeleket és szóközöket tartalmaz. Ellenőrizd, hogy a hossza megfelel-e a várt országnak.

Tisztítás: Távolíts el minden nem numerikus karaktert a kötőjelek és zárójelek kivételével. Szükség esetén vágd le az elöl álló nullákat vagy szóközöket.

Szövegmezők (hozzászólások, nevek, címek)

Validálás: Ellenőrizd, hogy a mező nem üres-e, és hogy a hossza ésszerű-e (nem több millió karakter).

Tisztítás: Távolítsd el vagy escape-eld a HTML-címkéket, a JavaScriptet és az SQL-különleges karaktereket. Csak sima szöveget és alap írásjeleket tarts meg.

Számok és összegek

Validálás: Ellenőrizd, hogy a bevitel szám-e. Áraknál vagy mennyiségeknél ellenőrizd, hogy pozitív szám-e.

Tisztítás: Távolíts el minden nem numerikus karaktert. Ha kell, kerekítsd a megfelelő tizedesjegyre.

Jelszavak

Validálás: Ellenőrizd a minimális hosszt (legalább 8 karakter), és igény szerint követelj meg nagybetűk, kisbetűk, számok és szimbólumok keverékét.

Tisztítás: Ne vágj le és ne módosíts jelszavakat. Pontosan abban a formában kell tárolni őket (hash-elve, soha nem egyszerű szövegként). Ha karaktereket vágsz le egy jelszóból, a felhasználók nem tudnak majd bejelentkezni.

Fájlfeltöltések

Validálás: Ellenőrizd, hogy a fájltípus az, amit vársz (pl. csak PDF-fájlok, csak képek). Ellenőrizd, hogy a fájlméret nem túl nagy.

Tisztítás: Nevezd át a fájlt, hogy a támadók ne használhassanak különleges fájlneveket. Vizsgáld meg a fájlt kártevők után. Tárold a webgyökéren kívül, hogy ne lehessen kódként végrehajtani.

Hogyan vezesd be a validálást és a tisztítást

Kliensoldalon (a böngészőben)

Használj HTML5 bevitelvalidáló attribútumokat, hogy azonnali visszajelzést adj a látogatóknak:

<input type="email" name="email" required> <input type="tel" name="phone" pattern="[0-9]{10}"> <input type="number" name="age" min="0" max="120">

Ez elkapja a nyilvánvaló hibákat, és javítja a felhasználói élményt. A kliensoldali validálást viszont ki lehet kerülni, ezért önmagában nem biztonsági intézkedés.

Szerveroldalon (a szervereden)

Itt történik a biztonság. A háttérkódodnak minden adatot validálnia és tisztítania kell:

// Pszeudokód példa if (email does not match email pattern) { reject the submission } // HTML-címkék eltávolítása sanitized_comment = remove_html_tags(comment_text) // Különleges karakterek escape-elése az adatbázis számára safe_name = escape_sql_characters(user_name) // Csak ezután tárold el az adatot store_in_database(safe_name, sanitized_comment)

Használj paraméterezett lekérdezéseket az adatbázisokhoz

Az SQL injekció elleni legjobb védelem a paraméterezett lekérdezés (előkészített utasításnak is hívják). Ahelyett, hogy a felhasználói bevitelt közvetlenül az SQL-lekérdezésbe tennéd, helyőrzőket használsz, és az adatot külön adod át:

// Rossz (sebezhető): query = "SELECT * FROM users WHERE email = '" + email + "'" // Jó (biztonságos): query = "SELECT * FROM users WHERE email = ?" execute(query, [email])

Paraméterezett lekérdezésekkel az SQL-értelmező tudja, hogy a felhasználói bevitel adat, nem kód. Még ha a támadó SQL-kódot küld is be, azt egyszerű szövegként kezeli.

Használj könyvtárakat és keretrendszereket

Ne a nulláról írj tisztítókódot. Használj bevált, erre a célra tervezett könyvtárakat. PHP-ban használd a htmlspecialchars() függvényt vagy egy olyan könyvtárat, mint a HTML Purifier. Pythonban használd a `html` modult vagy egy olyan könyvtárat, mint a bleach. Node.js-ben használd az `express-validator` csomagot vagy hasonlót. Ezeket a könyvtárakat tesztelték, és frissítik őket az új támadástípusok kezelésére.

Gyakori validálási és tisztítási hibák

Csak kliensoldalon validálsz. A kliensoldali validálás a felhasználói élményt szolgálja, nem a biztonságot. A támadó ki tudja kerülni. Szerveren is validálnod kell.

Tiltólistára teszed a veszélyes karaktereket, ahelyett, hogy engedélyezőlistát használnál a biztonságosakra. Ha az SQL injekciót a pontosvesszők és idézőjelek eltávolításával próbálod blokkolni, a támadók megtalálják a kiskaput. Ehelyett engedélyezd azokat a karaktereket, amelyeket vársz (telefonszámoknál csak számjegyeket és kötőjeleket), és utasíts el mindent a többit.

Megbízol az űrlapmező adattípusában. Ha van egy szám meződ, a böngésző olyan szöveget küld, amely számnak néz ki. A szervernek még így is ellenőriznie kell, hogy tényleg szám-e, mielőtt felhasználja. Soha ne feltételezd, hogy az adattípus helyes.

Elfelejted megtisztítani a megjelenített adatokat. Még ha az adat biztonságosan van is tárolva, ha escape-elés nélkül jeleníted meg egy weboldalon, a támadók olyan kódot injektálhatnak, amely lefut a látogatók böngészőjében, amikor megnézik az adatot.

Rossz sorrendben tisztítasz. Először validálj (megfelelő a formátum?), aztán tisztíts (biztonságos?). Ha előbb tisztítasz, aztán validálsz, elutasíthatsz olyan adatot, amely valójában biztonságos volt.

Mit tesz a WEMASY a bevitel validálásáért

A WEMASY automatikusan validálja az űrlapmezőket a választott mezőtípus alapján. Az e-mail mezőknél a rendszer érvényes e-mail formátumot ellenőriz. A szám mezőknél numerikus bevitelt. A kötelező mezőknél tartalmat a beküldés előtt. Szerveroldalon a WEMASY minden bevitelt megtisztít, és eltávolítja a HTML-t, a JavaScriptet és más veszélyes kódot, mielőtt tárolja a beküldéseket. Te állítod be, mely mezőket gyűjtöd, a validálást és tisztítást pedig a WEMASY intézi a háttérben.

Nézd meg, mely űrlapfunkciók tartoznak a csomagodhoz az árazási oldalon.

Gyakran ismételt kérdések

Használhatok WAF-ot (webalkalmazás-tűzfalat) a validálás helyett?
A WAF képes elkapni néhány injekciós támadást, mielőtt elérné az űrlapodat, ami hasznos. De nem helyettesíti a validálást és a tisztítást. A WAF a második védelmi vonal. Az űrlapkódodnak magának is validálnia és tisztítania kell az adatokat. A WAF és a bevitel validálása együtt több védelmi réteget ad.
Mi van, ha egy látogatónak jogosan kell különleges karaktereket beküldenie?
Az olyan különleges karakterek, mint az aposztrófok, kötőjelek és az és-jelek, biztonságosak, ha megfelelően tisztítasz. Valakinek lehet például "O'Brien" vagy "Mary-Jane" a neve. Ezeket biztonságos elfogadni, ha megfelelően escape-eled őket az adatbázisodnak (paraméterezett lekérdezésekkel) és a megjelenítéskor (HTML-escape-eléssel). A kulcs a megfelelő tisztítás, nem a karakterek blokkolása.
Validáljak kliens- és szerveroldalon is?
Igen. A kliensoldali validálás azonnali visszajelzést ad a látogatóknak, és javítja az élményt (tudják, hogy elgépeltek valamit, még a beküldés előtt). A szerveroldali validálás az, ami valóban véd a támadások ellen. Használd mindkét réteget. A kliensoldal a felhasználói élményért van. A szerveroldal a biztonságért.
Mi a különbség az escape-elés és a tisztítás között?
Az escape-elés átalakítja a veszélyes karaktereket, hogy sima szövegként kezeljék őket (például a < jelet < alakra írja át). A tisztítás teljesen eltávolítja a veszélyes tartalmat (például kivág minden HTML-címkét). Az escape-elés megtartja az adatot, a tisztítás eltávolítja a fenyegetést. A legtöbb űrlapadatnál a tisztítás (a címkék teljes eltávolítása) biztonságosabb, mint az escape-elés (az átalakításuk).
Kell aggódnom az injekciós támadások miatt a csak olvasható űrlapokon?
Ha egy űrlap csak információt jelenít meg (nem küld be semmit), nincs injekciós sebezhetősége. Ha viszont az az űrlap valaha felhasználók által beküldött adatot jelenít meg, akkor is tisztítanod kell. Egy támadó korábban beküldhetett rosszindulatú kódot, és amikor megjeleníted, az a kód lefut. Mindig tisztíts meg minden felhasználó által beküldött adatot a megjelenítés előtt, az űrlap típusától függetlenül.

Használd ki azonnal
a saját weboldaladon.

Kezdd ingyen a WEMASY-vel, és építsd fel az oldaladat pár perc alatt.