Cross-site request forgery
A CSRF az XSS-sel ellentétben nem azon alapul, hogy a felhasználó megbízik az adott oldalon lévő tartalomban, hanem pont az ellenkezőjében, vagyis az oldal bízik meg az adott felhasználóban, és az ő nevében probálunk meg végrehajtani műveleteket. Nézzünk erre egy egyszeru példát!
Egyszerű példa
Az áldozati bárány legyen a chat.hu ismételten. Az oldalra lehet fényképeket feltölteni, amikhez lehet kommenteket is fűzni. Amikor épp chat-el az emer, akkor már autentikálva van az oldalon, van érvényes session-je. Ilyenkor elég bedobni egy linket, ami GET paramétereken keresztül kommentel valakinek a képére. A linkből eléggé nyilvánvaló, hogy mit fog csinálni, de itt a legtöbben nem értenek az ilyesmihez, így minden további nélkül rákattintanak.
Tehát a sikeres kivitelezéshez szükseg van néhány előfeltételre:
Ha ezek teljesülnek, akkor igen sokféle módon megoldaható a végrehajtás, kezdve a JavaScript-ektől a speciális img tag-en át a megtévesztő linkekig. Az img tag amúgy azért nagyon jó, mert a legtöbb ember ugyan JS futtatást nem engedélyez, de a képeket megjelenítteti.
Hogyan védekezzünk?
Létezik pár módszer.
Az img tag-es támadást a legegyszerűbben úgy védhetjük ki, hogy GET paraméterekből nem fogadunk el minden utasítást. Ezt persze meg lehet kerülni egy form használatával, és POST-olásával, esetleg ha XSS áldozatati bárány az oldal, ezt esetleg mind helyben el tudjuk intézni JS-sel. Tehát az XSS kivédése is kritikus.
A következő, hogy a formokban mindig legyenek véletlen tokenek egy rejtett mezőben. Ezeket szerver oldalon ellenőrizzük a session mellett, így nem tud akárki akármit csak úgy POST-olni az oldalra.
Még van egy olyan lehetoseg is, hogy a cookie adatokat duplán küldjük el. Ezt JS-sel megtehetjük, hiszen onnan a sütik adatait el tudjuk érni. Ennek persze nagy hátránya, hogy a kliens oldalon engedélyezni kell a JS-ek futtatását, ami pedig az XSS melegágya.
Lehet ellenőrizni a HTTP referer-t is, bár ennek nem sok haszna van, mivel sokan alapból tiltják a referert, esetleg proxy-t használnak, ami kiszűrheti; vagy egyszerűen hamisított HTTP fejleceket küldenek különféle böngészőhibák kihasználásaval. Így ebben egyáltalán nem szabad megbízni.
Végül - bar ez a kényelem rovására megy -, használjunk rövidebb lejáratú sessionöket vagy valamiféle automatikus kijelentkeztetést!
Ismét köszonet a wikipedianak a sok kiegészítő információért, amit ebben a bejegyzésben is felhasználtam.