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.