CSRF Ну наконец пришло время рассказать про CSRF-уязвимости Смотри теб

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
CSRF
Ну и наконец, пришло время рассказать про CSRF-уязвимости. Смотри, у тебя есть функция разлогинивания. Чтобы разлогиниться, нужно отправить GET-запрос на адрес /logout.php и тебя разлогинит. Это позволяет сделать такую вещь:
злодей заходит на какой-нибудь популярный форум, где можно постить картинки и постит картинку с URL http://твойсайт/logout.php
У любого человека, который зайдет на этот форум, браузер попытается отобразить эту картинку и отправит запрос и тем самым разлогинит этого пользователя с твоего сайта. Это и есть CSRF уязвимость, когда код размещенный на одном сайте, может делать какие-то вещи на другом.
Разлогинивание — это не очень страшно, но ведь так могут эксплуатироваться более серьезные функции: запостить комментарий, удалить пользователя, перевести деньги. Потому твои формы и ссылки должны быть защищены от CSRF.
Как защититься от CSRF?
Самый надежный способ — выдавать каждому посетителю уникальный токен. Этот токен можно вычислять из IP-адреса, а еще лучше — генерировать и сохранять в куку (так как IP может меняться между запросами). И соответсвенно, в формы и ссылки добавлять токен, который проверяется на сервере. Вот, смотри, есть 2 пользователя:
A заходит на сайт. Сайт выдает ему токен в куке csrf=abc123. Ссылка на разлогинивание для A выглядит как logout.php?t=abc123
B (злодей) заходит на сайт. Сайт выдает ему токен csrf=xyz789 и у него ссылка выглядит как logout.php?t=xyz789
B не знает, какой токен у A, и не может сделать ссылку, при заходе по которой A бы разлогинило. Таким образом, CSRF уязвимости тут нету. Точно также, этот токен подставляется во все формы, и сервер проверяет его на правильность, прежде чем сто-то сделать.
Если хочешь, можешь попробовать сделать защиту от CSRF и у себя. думаю, лучше всего ее делать через функции, функция для генерации токена (если его нет в куках), и функция для проверки токена.