Syötteen validointi, puhdistus ja injektiohyökkäysten estäminen

Opi, miten syötteen validointi ja puhdistus suojaavat lomakkeita injektiohyökkäyksiltä ja mikä tekee lomakedatasta turvallista.

Luonnos

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.

Usein kysytyt kysymykset

Voinko käyttää WAF-palomuuria (Web Application Firewall) validoinnin sijaan?
WAF voi pysäyttää osan injektiohyökkäyksistä ennen kuin ne pääsevät lomakkeellesi, mikä on hyödyllistä. Se ei kuitenkaan korvaa validointia ja puhdistusta. WAF on toinen puolustuslinja. Lomakkeesi koodin täytyy silti validoida ja puhdistaa data itse. Kun käytät sekä WAF:ia että syötteen validointia, saat useita suojakerroksia.
Entä jos kävijän on aivan aiheellisesti lähetettävä erikoismerkkejä?
Erikoismerkit, kuten heittomerkit, yhdysmerkit ja et-merkit, ovat turvallisia, jos puhdistat oikein. Jonkun nimi voi esimerkiksi olla "O'Brien" tai "Mary-Jane". Ne on turvallista hyväksyä, kun suojaat ne oikein tietokantaa varten (parametrisoiduilla kyselyillä) ja kun näytät ne (HTML:n suojauksella). Avain on oikea puhdistus, ei merkkien estäminen.
Pitäisikö validoida sekä asiakas- että palvelinpuolella?
Kyllä. Asiakaspuolen validointi antaa kävijöille heti palautetta ja parantaa kokemusta (he huomaavat kirjoitusvirheen ennen lähettämistä). Palvelinpuolen validointi suojaa hyökkäyksiltä oikeasti. Käytä molempia kerroksia. Asiakaspuoli on käyttökokemusta varten. Palvelinpuoli on tietoturvaa varten.
Mitä eroa on suojaamisella (escaping) ja puhdistuksella?
Suojaaminen muuttaa vaaralliset merkit niin, että niitä käsitellään pelkkänä tekstinä (esimerkiksi < muutetaan muotoon <). Puhdistus poistaa vaarallisen sisällön kokonaan (esimerkiksi kaikki HTML-tagit poistetaan). Suojaaminen säilyttää datan, puhdistus poistaa uhan. Useimmassa lomakedatassa puhdistus (tagien poistaminen kokonaan) on turvallisempaa kuin suojaaminen (niiden muuttaminen).
Pitääkö minun huolehtia injektiohyökkäyksistä lomakkeissa, jotka vain näyttävät tietoa?
Jos lomake vain näyttää tietoa (eikä lähetä mitään), siinä ei ole injektioheikkoutta. Jos lomake kuitenkin joskus näyttää käyttäjien lähettämää dataa, sinun täytyy silti puhdistaa se. Hyökkääjä on voinut lähettää haitallista koodia aiemmin, ja kun näytät sen, koodi ajetaan. Puhdista aina kaikki käyttäjien lähettämä data ennen sen näyttämistä lomakkeen tyypistä riippumatta.

Ota se heti käyttöön
omalla verkkosivullasi.

Aloita ilmaiseksi WEMASYlla ja rakenna sivusi muutamassa minuutissa.