CSRF-suojaus ja lomakkeen manipuloinnin estäminen

Opi, mitä CSRF-hyökkäykset ovat ja miten lomaketunnisteet estävät hyökkääjiä kaappaamasta lomakkeitasi. Selvitä, miksi jokainen lomake tarvitsee CSRF-suojan.

Luonnos

Kuvittele, että joku huijaa kävijän klikkaamaan linkkiä, kun hän on kirjautuneena pankkitililleen. Linkki johtaa piilotettuun lomakkeeseen, joka kävijän tietämättä lähettää pankille pyynnön siirtää rahaa. Pankki näkee oikeaksi näyttävän pyynnön kirjautuneelta käyttäjältä ja käsittelee sen. Hyökkääjä on nyt siirtänyt rahaa uhrin tililtä tietämättä koskaan tämän salasanaa.

Tätä CSRF (Cross-Site Request Forgery) tarkoittaa: hyökkäys, jossa hyökkääjä saa uhrin tietämättään lähettämään lomakkeen tai pyynnön toiselle verkkosivustolle, jolle uhri on jo kirjautunut.

Tässä opit: mitä CSRF-hyökkäykset ovat ja miten ne toimivat, miksi ne ovat vaarallisia silloinkin, kun muita suojauksia on käytössä, miten CSRF-tunnisteet estävät ne ja miten suojaus otetaan käyttöön lomakkeissasi.

Mikä CSRF on?

CSRF (äännetään englanniksi "sea-surf") tulee sanoista Cross-Site Request Forgery. Se on hyökkäys, joka hyödyntää sitä, että kun olet kirjautuneena verkkosivustolle, selaimesi luottaa istuntoosi ja lisää sen automaattisesti jokaiseen sivustolle tekemääsi pyyntöön, vaikka pyyntö tulisi toiselta verkkosivustolta.

Hyökkäys toimii huijaamalla kirjautunutta kävijää lähettämään tietämättään lomake verkkosivustolle, jolla hänellä on tili. Hyökkääjä ei näe uhrin salasanaa. Sitä ei tarvitakaan. Hänen tarvitsee vain saada uhri tekemään pyyntö (esimerkiksi lähettämään piilotettu lomake) silloin, kun uhri on jo kirjautuneena, ja pyyntö tekee jotain, mitä hyökkääjä haluaa.

CSRF eroaa muista hyökkäyksistä, koska se ei vaadi tunnusten varastamista tai salauksen murtamista. Se hyödyntää uhrin luottamusta verkkosivustoon. Uhri on jo tunnistautunut, joten verkkosivusto luottaa pyyntöihin, jotka näyttävät tulevan häneltä.

Miten CSRF-hyökkäykset toimivat

CSRF-hyökkäys tapahtuu kolmessa vaiheessa.

Vaihe 1: uhri on kirjautuneena sivustollesi

Joku käy verkkosivustollasi ja kirjautuu tililleen. Hänen selaimessaan on nyt aktiivinen istuntoeväste, joka todistaa hänen tunnistautumisensa. Istunto pysyy aktiivisena niin kauan kuin hän käyttää sivustoa.

Vaihe 2: hyökkääjä huijaa hänet haitalliselle sivulle

Ollessaan yhä kirjautuneena sivustollesi uhri käy sivulla, jota hyökkääjä hallitsee (ehkä linkki sosiaalisesta mediasta, harhaanjohtava mainos tai aidolta näyttävä verkkosivusto). Sivulla on piilotettua koodia, joka lähettää lomakkeen takaisin sivustollesi.

Vaihe 3: lomake lähtee automaattisesti uhrin istunnolla

Piilotettu lomake lähetetään verkkosivustollesi. Koska uhri on jo kirjautuneena, hänen selaimensa lisää pyyntöön automaattisesti istuntoevästeen. Lomakkeesi näkökulmasta tämä on aito pyyntö tunnistautuneelta käyttäjältä. Lomake käsittelee sen niin kuin uhri olisi lähettänyt sen tarkoituksella.

Hyökkääjä on nyt tehnyt sivustollasi jotain uhrin tilillä uhrin tietämättä. Hän on voinut vaihtaa salasanan, siirtää rahaa, päivittää profiilin tai lähettää tietoja.

Miksi tämä toimii, vaikka muita suojauksia on käytössä

CSRF-hyökkäykset ohittavat useita yleisiä suojausominaisuuksia:

HTTPS ei pysäytä CSRF:ää. Tieto on salattu siirron aikana, mutta hyökkääjän ei tarvitse siepata sitä. Hän lähettää pyynnön uhrin selaimesta, ja uhrin selain luottaa jo siihen.

Salasanasuojaus ei pysäytä CSRF:ää. Hyökkääjä ei koskaan tarvitse uhrin salasanaa. Hän hyödyntää vain sitä, että uhri on jo kirjautuneena.

Vahva kirjautumisjärjestelmä ei pysäytä CSRF:ää. Vaikka tunnistautuminen olisi täydellinen, hyökkäys toimii, jos uhri on kirjautuneena.

Siksi CSRF-suojaus on oma kerroksensa. Muut suojaukset eivät estä sitä. Lomakkeet pitää suunnitella erikseen kestämään CSRF-hyökkäykset.

CSRF-tunnisteet: näin ne pysäyttävät hyökkäyksen

Ratkaisu on CSRF-tunniste. Se on yksilöllinen, arvaamaton merkkijono, jonka palvelimesi luo jokaiselle lomakkeelle. Näin se toimii:

Palvelimesi luo yksilöllisen tunnisteen jokaiselle kävijälle

Kun joku lataa lomakkeen sisältävän sivun, palvelimesi luo satunnaisen tunnisteen ja liittää sen kyseisen käyttäjän istuntoon. Tunniste on joka kerta erilainen ja yksilöllinen kyseiselle käyttäjälle.

Tunniste upotetaan lomakkeeseen

Tunniste lisätään HTML-lomakkeeseen piilotettuna kenttänä. Kun kävijä lähettää lomakkeen, tunniste kulkee mukana.

Palvelimesi tarkistaa tunnisteen ennen lähetyksen käsittelyä

Kun lomake lähetetään, palvelimesi tarkistaa, vastaako lähetyksen tunniste sitä tunnistetta, jonka loit tämän käyttäjän istuntoon. Jos vastaa, lomake käsitellään. Jos ei vastaa (tai tunnistetta ei ole), lomake hylätään.

Hyökkääjän piilotettu lomake ei voi sisältää kelvollista tunnistetta, koska tunnisteet ovat arvaamattomia ja yksilöllisiä jokaiselle istunnolle. Toisen verkkotunnuksen hyökkääjä ei voi nähdä tai arvata tunnistetta. Siksi hyökkäys epäonnistuu. Piilotettu lomake lähtee, mutta palvelimesi hylkää sen, koska tunniste ei täsmää.

Miltä CSRF-tunniste näyttää käytännössä

HTML:ssä CSRF-suojattu lomake näyttää tältä:

<form method="POST" action="/submit-form"> <input type="hidden" name="csrf_token" value="a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"> <input type="email" name="email" placeholder="Sähköpostisi"> <button type="submit">Lähetä</button> </form>

Kenttä `csrf_token` on piilotettu. Kävijä ei näe sitä, mutta se lähtee lomakkeen tietojen mukana. Palvelimesi tarkistaa sen ennen sähköpostin tai muiden tietojen käsittelyä.

CSRF-suojaus eri lomaketyypeille

Perinteiset HTML-lomakkeet

Tavalliset HTML-lomakkeet (ne, jotka lähettävät tietoja palvelimellesi POST-pyynnöllä) tarvitsevat CSRF-tunnisteet. Tähän kuuluvat yhteydenottolomakkeet, kirjautumislomakkeet, salasanan palautuslomakkeet ja kaikki lomakkeet, jotka muuttavat tietoja palvelimellasi.

AJAX- ja JavaScript-lomakkeet

JavaScriptillä rajapintaan lähetettävät lomakkeet tarvitsevat myös CSRF-suojan. Tunniste voidaan upottaa itse lomakkeeseen, tallentaa evästeeseen tai hakea meta-tunnisteesta ennen pyynnön lähettämistä.

Tilattomat rajapintapyynnöt

Jos rajapintasi käyttää tunnistepohjaista tunnistautumista (kuten JWT), CSRF-suojaus toimii eri tavalla. Selain ei voi liittää JWT-tunnistetta automaattisesti samalla tavalla kuin istuntoevästettä, joten perinteinen CSRF on pienempi uhka. Paras käytäntö on silti lisätä ylimääräinen CSRF-tunniste lisäsuojaksi.

Muut suojaukset, jotka toimivat CSRF-tunnisteiden kanssa

CSRF-tunnisteet ovat ensisijainen puolustus, mutta ne toimivat parhaiten yhdessä muiden tietoturvakäytäntöjen kanssa.

SameSite-evästeet

Kun asetat istuntoevästeen, voit lisätä siihen `SameSite`-määrityksen, joka käskee selainta olemaan lisäämättä evästettä pyyntöihin, jotka tulevat toiselta verkkotunnukselta. Tämä estää hyökkääjän piilotettua lomaketta käyttämästä uhrin istuntoa lainkaan.

Referer-otsikon tarkistukset

Palvelimesi voi tarkistaa Referer-otsikon nähdäkseen, mistä pyyntö tuli. Jos lomakkeen lähetys väittää tulevansa verkkotunnuksestasi, mutta Referer näyttää toisen verkkotunnuksen, kyseessä on todennäköisesti hyökkäys. (Referer-otsikoita voi kuitenkin väärentää, joten tämä ei ole täydellinen suoja.)

Double-submit-evästemalli

Tässä tavassa CSRF-tunniste tallennetaan sekä evästeeseen että lomakkeen kenttään. Palvelimesi tarkistaa, että ne täsmäävät, ennen käsittelyä. Tämä on harvinaisempi kuin perinteinen tunniste, mutta toimii hyvin tilattomissa sovelluksissa.

Miten CSRF-suojaus otetaan käyttöön

Toteutuksen yksityiskohdat riippuvat teknologiastasi, mutta toimintatapa on sama:

  1. Luo yksilöllinen tunniste istuntoa kohti. Kun käyttäjä aloittaa istunnon tai lataa lomakesivun, taustajärjestelmäsi luo uuden tunnisteen.
  2. Tallenna tunniste palvelimelle. Tallenna se kyseisen käyttäjän istunnon yhteyteen.
  3. Lisää tunniste lomakkeeseen. Lisää se piilotettuna kenttänä HTML:ään tai meta-tunnisteena, jonka JavaScript voi lukea.
  4. Tarkista lähetettäessä. Ennen lomakkeen tietojen käsittelyä tarkista, että lähetetty tunniste vastaa kyseisen istunnon tallennettua tunnistetta.
  5. Luo uusi tunniste arkaluonteisten toimintojen jälkeen. Kun käyttäjä vaihtaa salasanansa tai tekee jotain kriittistä, luo uusi tunniste.

Useimmat nykyaikaiset sovelluskehykset hoitavat CSRF-tunnisteiden luonnin ja tarkistuksen automaattisesti. Jos käytät sovelluskehystä, CSRF-suojaus on yleensä oletuksena päällä. Varmista vain, ettet vahingossa poista sitä käytöstä.

Yleiset virheet, jotka jättävät lomakkeet haavoittuviksi

CSRF-suojauksen poistaminen mukavuuden vuoksi. Jotkin kehittäjät poistavat CSRF-tarkistukset käytöstä helpottaakseen rajapinnan testausta tai yksinkertaistaakseen koodiaan. Älä tee niin. Se luo todellisen haavoittuvuuden.

Saman tunnisteen käyttö kaikille käyttäjille. Tunnisteen täytyy olla yksilöllinen jokaisen käyttäjän istunnolle. Tunniste, joka on sama kaikille (tai sama kaikille käyttäjille kaikkina päivinä), ei suojaa CSRF:ltä.

Tunnisteiden uusimatta jättäminen. Jos käytät samaa tunnistetta viikkoja, hyökkääjällä on enemmän aikaa hyödyntää sitä. Uusi tunnisteet säännöllisesti ja aina arkaluonteisten toimintojen jälkeen.

Pelkkiin SameSite-evästeisiin luottaminen. SameSite auttaa, mutta ei riitä yksin. Käytä CSRF-tunnisteita ensisijaisena suojana ja SameSitea varmistuksena.

Tunnisteiden unohtaminen joistakin lomakkeista. Jos suojaat osan lomakkeista tunnisteilla mutta et toisia, hyökkääjät käyttävät suojaamattomia lomakkeita. Jokainen tietoja muuttava lomake tarvitsee suojan.

Mitä WEMASY tekee CSRF-suojauksen eteen

WEMASYn lomakkeisiin tulee automaattisesti CSRF-tunnistesuojaus jokaiselle luomallesi lomakkeelle. Sinun ei tarvitse määrittää sitä tai ajatella sitä. Kun kävijä lähettää lomakkeen, WEMASY tarkistaa tunnisteen ennen lähetyksen tallentamista. Tämä suojaus on sisäänrakennettu ja oletuksena käytössä.

Lue lisää lomakkeiden suojausvaihtoehdoista hinnoittelusivulta.

Usein kysytyt kysymykset

Voiko hyökkääjä arvata CSRF-tunnisteen?
Teoriassa ei. CSRF-tunnisteet ovat kryptografisesti satunnaisia ja vaihtuvat usein. Hyökkääjän pitäisi kokeilla miljardeja mahdollisuuksia tunnisteen arvaamiseksi. Käytännössä CSRF-tunnisteet ovat niin arvaamattomia, ettei arvaaminen ole toimiva hyökkäystapa. Tunnisteen vahvuus tulee satunnaisuudesta ja yksilöllisyydestä, ei siitä, että se pidetään salassa.
Mitä tapahtuu, jos kävijä lähettää lomakkeen ja tunniste on virheellinen?
Lomakkeen lähetys hylätään. Palvelimesi ei käsittele lomakkeen tietoja eikä tallenna lähetystä. Kävijä näkee yleensä virheilmoituksen (kuten "Istunto vanhentui" tai "Virheellinen pyyntö") ja häntä pyydetään yrittämään uudelleen. Hyökkääjän kannalta piilotettu lomake ei yksinkertaisesti toimi.
Tarvitsenko CSRF-suojauksen, jos lomakkeeni ei vaadi kirjautumista?
Kyllä. CSRF-hyökkäykset voivat toimia myös lomakkeissa, jotka eivät vaadi tunnistautumista. Hyökkääjä voi käyttää CSRF:ää huijatakseen kävijän lähettämään ei-toivottuja tietoja mihin tahansa lomakkeeseen, oli kävijä kirjautuneena tai ei. Jokainen lähetyksiä käsittelevä lomake tarvitsee CSRF-suojan.
Miten CSRF eroaa XSS:stä?
Cross-Site Scripting (XSS) tarkoittaa, että hyökkääjä lisää verkkosivustoosi haitallista koodia, joka suoritetaan kävijöiden selaimissa. CSRF tarkoittaa, että hyökkääjä huijaa kävijän selaimen lähettämään lomakkeen toiselle sivustolle. Ne ovat eri hyökkäyksiä, joihin on eri puolustukset. CSRF-tunnisteet suojaavat CSRF:ltä, syötteen tarkistus ja puhdistus suojaavat XSS:ltä.
Entä hyökkäykset mobiilisovelluksiin? Toimivatko CSRF-tunnisteet?
Mobiilisovellukset ovat vähemmän alttiita perinteisille CSRF-hyökkäyksille, koska ne eivät liitä evästeitä automaattisesti samalla tavalla kuin selaimet. Mobiilisovellusten pitäisi silti käyttää tunniste- tai varmennepohjaista tunnistautumista. Jos mobiilisovellus käyttää evästeitä tai tunnisteita, jotka lähetetään pyyntöjen mukana automaattisesti, sen pitäisi tarkistaa myös CSRF-tunnisteet lisäsuojakerroksena.

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

Aloita ilmaiseksi WEMASYlla ja rakenna sivusi muutamassa minuutissa.