Chciałem dowiedzieć się jak zabezpieczać się przed atakami CSRF więc zrobiłem testową aplikację do tego celu:
użytkownik może dodawać i usuwać znajomych oraz pisać komentarze a w nich umieszczać linki. Użytkownik może usunąć ze znajomych użytkownika klikając na link 'usuń' w swoim profilu w znajomych - na końcu linka jest podawany id znajomego do usunięcia:
<a href="/profil/znajomi/usun/<?php echo $z->getIdentyfikator() ?>" >usuń ze znajomych
</a>
Po kliknięciu w linka, id jest oczywiście zamieniane na liczbę całkowitą, jest sprawdzenie czy w ogóle podano id, czy użytkownik o takim id istnieje oraz czy zalogowany użytkownik, który chce usunąć znajomego ma w swoich znajomych użytkownika o danym id.
Użytkownik o id=2 ma w znajomych uzytkownika o id=4.
Jako użytkownika o id=999 dodałem komentarz:
"Bla, bla,<IMG src="/profil/znajomi/usun/4"> bla, bla"
Następnie zalogowałem się jako użytkownik o id=2 i wszedłem na stronę z tym komentarzem, w skutek czego nie zobaczyłem oczywiście obrazka a z moich znajomych został usunięty użytkownik o id=4 bez mojej wiedzy i zgody - klasyczny przykład ataku CSRF.
Wymyśliłem więc sobie, że żeby usunąć użytkownika ze znajomych trzeba to potwierdzić - do czego użyłem ajaxa:
<a href="/profil/znajomi" onclick="potwierdzUsuniecieZnajomego(<?php echo $z->getIdentyfikator() ?>); " >usuń ze znajomych
</a>
Po kliknięciu na linka wyskakuje messagebox z prośbą o potwierdzenie, w przypadku potwierdzenia do funkcji php z funkcji javascript jest przesyłany id użytkownika do usunięcia ze znajomych metodą post, w funkcji php jest sprawdzane czy żądanie przyszło metodą post itd. czego skutkiem jest usunięcie osoby ze znajomych.
Po wyłaczeniu w przeglądarce javascripta usunięcie uzytkownika ze znajomych nie jest możliwe, ale:
"Bla, bla,<IMG src="/profil/znajomi/usun/4"> bla, bla" już nie działa

Czy to wystarczające zabezpieczenie przed atakiem CSRF ?