Hyökkääjät eivät täytä lomakkeita tavallisesti. He lähettävät koodia, jonka tarkoitus on murtautua järjestelmiisi tai varastaa tietoja. He voivat lähettää JavaScriptiä, joka ajetaan kävijöiden selaimissa, SQL-komentoja, jotka rikkovat tietokantasi, tai haitallista sisältöä, joka aiheuttaa vahinkoa. Syötteen validointi ja puhdistus ovat suojaukset, jotka pysäyttävät nämä hyökkäykset.
Tästä oppaasta opit: mitä syötteen validointi ja puhdistus ovat, miten ne eroavat toisistaan, miten injektiohyökkäykset toimivat, mitkä suojaukset sopivat eri tietotyypeille ja miten otat ne käyttöön lomakkeissasi.
Mitä syötteen validointi on?
Validointi tarkoittaa sen tarkistamista, että lomakkeelle lähetetty data on odotetussa muodossa ja täyttää vaatimuksesi. Se on ensimmäinen puolustuslinja haitallista syötettä vastaan.
Validointi vastaa kysymyksiin, kuten onko tämä sähköpostiosoite vai satunnaista tekstiä, onko tämä luku vai sana, onko kenttä tyhjä, vaikka ei saisi olla, ja kirjoittiko kävijä jotain, mikä sopii tähän kenttään, vai jotain epäilyttävää.
Esimerkkejä siitä, mitä validointi tarkistaa:
- Sähköpostikentässä pitää olla @-merkki ja verkkotunnus
- Puhelinnumerokentässä saa olla vain numeroita ja yhdysmerkkejä
- Lukukentässä ei saa olla kirjaimia
- Pakollinen kenttä ei saa olla tyhjä
- Salasanakentän pitää täyttää vähimmäispituus
Validointi tapahtuu kahdessa paikassa. Kävijän laitteella sitä kutsutaan asiakaspuolen validoinniksi. Palvelimellasi sitä kutsutaan palvelinpuolen validoinniksi. Asiakaspuolen validointi antaa kävijälle heti palautetta, jos tämä tekee virheen. Palvelinpuolen validointi suojaa hyökkäyksiltä oikeasti, koska hyökkääjät voivat ohittaa asiakaspuolen tarkistukset.
Mitä syötteen puhdistus on?
Puhdistus tarkoittaa kaiken vaarallisen poistamista käyttäjän syötteestä tai tekemistä vaarattomaksi ennen kuin tallennat tai käsittelet sen. Vaikka data läpäisisi validoinnin, siinä voi silti olla koodia tai merkkejä, joiden tarkoitus on aiheuttaa vahinkoa.
Esimerkkejä siitä, mitä puhdistus tekee:
- Poistaa tekstikentistä HTML-tagit, kuten `<script>` ja `<img>`
- Poistaa SQL-erikoismerkit, joilla tietokantaan voisi murtautua
- Suojaa erikoismerkit niin, että ne käsitellään tekstinä eikä koodina
- Rajoittaa syötteen pituutta puskuriylivuotohyökkäysten estämiseksi
Validointi ja puhdistus toimivat yhdessä, mutta niillä on eri tehtävä. Validointi tarkistaa, että data on oikeassa muodossa. Puhdistus poistaa kaiken vaarallisen, vaikka muoto olisi teknisesti oikea.
Miten injektiohyökkäykset toimivat?
SQL-injektio
SQL-injektiohyökkäys tapahtuu, kun hyökkääjä syöttää lomakekenttään SQL-koodia. Jos lomakkeesi koodi ei puhdista syötettä, SQL-koodi ajetaan tietokannassasi.
Esimerkki: kirjautumislomake kysyy sähköpostiosoitetta. Hyökkääjä ei lähetä sähköpostiosoitettaan vaan tämän:
' OR '1'='1 Jos lomakkeesi ei puhdista syötettä, koodisi voi ajaa SQL-kyselyn, joka näyttää tältä:
SELECT * FROM users WHERE email = '' OR '1'='1' Osa `OR '1'='1'` tekee ehdosta aina todellisen, joten kysely palauttaa kaikki käyttäjät eikä vain sitä yhtä, jolla on kyseinen sähköpostiosoite. Hyökkääjä on nyt ohittanut kirjautumisjärjestelmän.
Cross-Site Scripting (XSS)
XSS-hyökkäys tapahtuu, kun hyökkääjä lähettää lomakekentässä JavaScript-koodia. Jos lomake ei puhdista koodia ja tallentaa sen, JavaScript ajetaan jokaisen selaimessa, joka katsoo kyseistä dataa myöhemmin.
Esimerkki: kommenttilomake ottaa vastaan käyttäjien kommentteja. Hyökkääjä lähettää tämän:
<script>alert('hacked')</script> Jos tätä ei puhdisteta ja se tallennetaan tietokantaan, JavaScript ajetaan aina, kun joku katsoo kommenttiosiota, ja se näyttää ilmoituksen. Vaarallisempi versio voisi varastaa evästeitä, ohjata kävijät kalastelusivulle tai viedä lomakedataa.
Komentoinjektio
Jos lomakedataa käytetään järjestelmäkomennoissa (joissakin taustajärjestelmissä näin tehdään), hyökkääjä voi syöttää käyttöjärjestelmän komentoja.
Esimerkki: lomakekenttää käytetään tällaisessa komennossa:
ffmpeg -i $filename output.mp4 Jos `$filename` ei ole puhdistettu ja hyökkääjä lähettää `;rm -rf /`, komennosta tulee:
ffmpeg -i ;rm -rf / output.mp4 Komento `rm -rf /` ajetaan ja poistaa tiedostoja järjestelmästä. Siksi järjestelmäkomennot eivät saa koskaan saada puhdistamatonta käyttäjän syötettä.
Validointi ja puhdistus eri tietotyypeille
Sähköpostiosoitteet
Validointi: Tarkista, että syöte vastaa sähköpostiosoitteen mallia (jotain tyyliin teksti@verkkotunnus.pääte). Varmista, että siinä on vain sallittuja merkkejä.
Puhdistus: Poista kaikki HTML-tagit ja erikoismerkit. Säilytä vain kirjaimet, numerot, pisteet, yhdysmerkit ja @-merkki.
Puhelinnumerot
Validointi: Tarkista, että siinä on vain numeroita, yhdysmerkkejä, sulkeita ja välilyöntejä. Varmista, että pituus sopii odotetulle maalle.
Puhdistus: Poista kaikki muut kuin numeromerkit paitsi yhdysmerkit ja sulkeet. Poista tarvittaessa etunollat tai välilyönnit.
Tekstikentät (kommentit, nimet, osoitteet)
Validointi: Tarkista, ettei kenttä ole tyhjä ja että pituus on kohtuullinen (ei miljoonia merkkejä).
Puhdistus: Poista tai suojaa HTML-tagit, JavaScript ja SQL-erikoismerkit. Säilytä vain pelkkä teksti ja perusvälimerkit.
Luvut ja summat
Validointi: Tarkista, että syöte on luku. Hinnoissa ja määrissä tarkista, että luku on positiivinen.
Puhdistus: Poista kaikki muut kuin numeromerkit. Pyöristä tarvittaessa oikeaan desimaalitarkkuuteen.
Salasanat
Validointi: Tarkista vähimmäispituus (vähintään 8 merkkiä) ja halutessasi vaadi sekoitus isoja ja pieniä kirjaimia, numeroita ja symboleja.
Puhdistus: Älä poista merkkejä salasanoista äläkä muokkaa niitä. Ne pitää tallentaa täsmälleen sellaisina kuin ne ovat (tiivisteenä, ei koskaan selkotekstinä). Jos poistat merkkejä salasanasta, käyttäjät eivät pääse kirjautumaan.
Tiedostojen lataukset
Validointi: Tarkista, että tiedostotyyppi on odotettu (esim. vain PDF-tiedostot, vain kuvat). Tarkista, ettei tiedosto ole liian suuri.
Puhdistus: Nimeä tiedosto uudelleen, jotta hyökkääjät eivät voi käyttää erikoisia tiedostonimiä. Tarkista tiedosto haittaohjelmien varalta. Tallenna se verkkopalvelimen juurikansion ulkopuolelle, jotta sitä ei voi ajaa koodina.
Miten validointi ja puhdistus otetaan käyttöön?
Asiakaspuolella (selaimessa)
Käytä HTML5:n syötteen validointimääritteitä, jotta kävijät saavat heti palautetta:
<input type="email" name="email" required> <input type="tel" name="phone" pattern="[0-9]{10}"> <input type="number" name="age" min="0" max="120"> Tämä pyydystää ilmeiset virheet ja parantaa käyttökokemusta. Asiakaspuolen validoinnin voi kuitenkin ohittaa, joten se ei yksin ole tietoturvakeino.
Palvelinpuolella (palvelimellasi)
Tässä tietoturva ratkaistaan. Taustakoodisi pitää validoida ja puhdistaa jokainen tieto:
// Pseudo-code example if (email does not match email pattern) { reject the submission } // Remove HTML tags sanitized_comment = remove_html_tags(comment_text) // Escape special characters for database safe_name = escape_sql_characters(user_name) // Only then store the data store_in_database(safe_name, sanitized_comment) Käytä parametrisoituja kyselyjä tietokannoissa
Paras suoja SQL-injektiota vastaan ovat parametrisoidut kyselyt (niitä kutsutaan myös valmisteltuiksi lauseiksi). Käyttäjän syötettä ei lisätä suoraan SQL-kyselyyn. Sen sijaan käytät paikkamerkkejä ja välität datan erikseen:
// Bad (vulnerable): query = "SELECT * FROM users WHERE email = '" + email + "'" // Good (safe): query = "SELECT * FROM users WHERE email = ?" execute(query, [email]) Parametrisoiduissa kyselyissä SQL-jäsennin tietää, että käyttäjän syöte on dataa eikä koodia. Vaikka hyökkääjä lähettäisi SQL-koodia, sitä käsitellään pelkkänä tekstinä.
Käytä kirjastoja ja kehyksiä
Älä kirjoita puhdistuskoodia alusta alkaen itse. Käytä vakiintuneita kirjastoja, jotka on tehty tähän tarkoitukseen. PHP:ssä käytä htmlspecialchars()-funktiota tai kirjastoa, kuten HTML Purifier. Pythonissa käytä `html`-moduulia tai kirjastoa, kuten bleach. Node.js:ssä käytä `express-validator`-kirjastoa tai vastaavaa. Näitä kirjastoja on testattu ja päivitetty vastaamaan uusiin hyökkäystyyppeihin.
Yleisiä validoinnin ja puhdistuksen virheitä
Validointi vain asiakaspuolella. Asiakaspuolen validointi on käyttökokemusta varten, ei tietoturvaan. Hyökkääjä voi ohittaa sen. Sinun täytyy validoida myös palvelimella.
Vaarallisten merkkien estolista turvallisten merkkien sallittujen listan sijaan. Jos yrität estää SQL-injektion poistamalla puolipisteet ja lainausmerkit, hyökkääjät löytävät keinon kiertää sen. Tee sen sijaan sallittujen merkkien lista odottamistasi merkeistä (puhelinnumeroissa vain numerot ja yhdysmerkit) ja hylkää kaikki muu.
Lomakekentän tietotyypin uskominen. Jos sinulla on lukukenttä, selain lähettää tekstiä, joka näyttää luvulta. Palvelimesi täytyy silti varmistaa, että se on oikeasti luku, ennen kuin sitä käytetään. Älä koskaan oleta, että tietotyyppi on oikea.
Näytettävän datan puhdistuksen unohtaminen. Vaikka data on tallennettu turvallisesti, jos näytät sen verkkosivulla ilman HTML:n suojausta, hyökkääjät voivat syöttää koodia, joka ajetaan kävijöiden selaimissa, kun he katsovat kyseistä dataa.
Puhdistus väärässä järjestyksessä. Validoi ensin (onko tämä oikeassa muodossa?) ja puhdista sitten (onko tämä turvallista?). Jos puhdistat ensin ja validoit sen jälkeen, voit hylätä dataa, joka oli oikeasti turvallista.
Mitä WEMASY tekee syötteen validoinnin eteen
WEMASY validoi lomakekentät automaattisesti valitsemasi kenttätyypin mukaan. Sähköpostikentistä tarkistetaan, että muoto on kelvollinen. Lukukentistä tarkistetaan, että syöte on numeerinen. Pakollisista kentistä tarkistetaan, että niissä on sisältöä, ennen kuin lomake lähetetään. Palvelinpuolella WEMASY puhdistaa kaiken syötteen poistaakseen HTML:n, JavaScriptin ja muun vaarallisen koodin ennen vastausten tallentamista. Sinä määrität, mitä kenttiä kerätään, ja WEMASY hoitaa validoinnin ja puhdistuksen taustalla.
Katso, mitkä lomakeominaisuudet kuuluvat sinun pakettiisi hinnastosivulla.