От распространённых уязвомостей, вроде SQL инъекций, я свой сайт более-менее защитил. Теперь вот узнал о такой уязвомости, как Сross Site Request Forgery. Рекомендуемое решение — добавление в параметр запроса некоего "токена".
Вопрос: чем является этот токен и как его использовать? Генерировать какое-то случайное значение и передавать его сначала в звпрос, а потом сравнивать на сервере? Как правильно это значение генерировать? Как правильно его добавлять к запросу?
Конечно, как это приблизительно выглядит я уже нашел в Сети, но этот проект на сайте нужно развивать, не так ли?

Принятый ответ

bladget, ну так если у тебя уже используется POST запрос, то речи о CSRF и быть не может. Соль этой штуки в том, что у тебя какие то действия выполняются через обычную ссылку, например - удаление всех сообщений почты происходит по ссылке
http://some.com/mail/?do=remove&scope=all
ты берешь на другом сайте и этому юзеру вставляешь картинку
[img]http://some.com/mail?do=remove&score=all[/img]
все это рендерится вот в это
<img src="http://some.com/mail?do=remove&score=all">
браузер видит картинку, начинает её грузить по этому адресу, он отправляет запрос
GET /mail?do=remove&score=all HTTP1.0
Host: some.com
Referer: no-name.com
Cookies: {cookie for some.com}
сервер это принимает, смотрит куки, видит что юзер авторизован. И начинает выполнять свои действия, потом отправляет результат обратно
{какой то хеадер ответа}

<h2>All messages from you mailbox are removed.</h2>
в результате:
картинка не отобразилась, потому что браузер получил не картинку
у юзера удалились все его сообщения из почтого ящика, и он этого не заметил
В этом и суть CSRF
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
29
10 лет назад
0
На твоем сайте просто ссылку на действие поставляй со случайным токеном и сохраняй его, для какого пользователя и на какое действие, а потом проверяй. После использования токен удалять и можно будет использовать снова. Таким образом злоумышленник не сможет подделать запрос. т.к. присутствует случайная величина. Кст да, после неправильного действия (если параметры токена не совпали), токен тоже надо удалять. А вообще это все конечно красиво, но гораздо проще проверять в хедере Referer. Хотя на мой взгляд лучше использовать обе техники

еще вспомнил. Можно использовать POST запросы для такого. Пост запрос так же через ссылку не подделаешь. Так 100% надежно
0
22
10 лет назад
0
гораздо проще проверять в хедере Referer
Читал что пользователь может как-то отключить Referrer'ы, что делает невозможным проверку, поэтому должно использовать токены. Может я что-то напутал?
Можно использовать POST запросы для такого. Пост запрос так же через ссылку не подделаешь. Так 100% надежно
Честно говоря я не понял. В данный момент у меня сделано так: для каждой формы генерируется уникальная пара ключ/значение, которая передаются вместе с данными формы и сравниваются скриптом-обработчиком формы. (для GET запросов я токены не использую). Пара хранится в сессии и очищается, естественным образом, после окончания сессии. Я думал сделать так, чтобы пара генерировалась каждый запрос новая, но пока времени не было. Доделаю, когда займусь шифрованием полей формы.
0
29
10 лет назад
Отредактирован alexprey
0
bladget, ну так если у тебя уже используется POST запрос, то речи о CSRF и быть не может. Соль этой штуки в том, что у тебя какие то действия выполняются через обычную ссылку, например - удаление всех сообщений почты происходит по ссылке
http://some.com/mail/?do=remove&scope=all
ты берешь на другом сайте и этому юзеру вставляешь картинку
[img]http://some.com/mail?do=remove&score=all[/img]
все это рендерится вот в это
<img src="http://some.com/mail?do=remove&score=all">
браузер видит картинку, начинает её грузить по этому адресу, он отправляет запрос
GET /mail?do=remove&score=all HTTP1.0
Host: some.com
Referer: no-name.com
Cookies: {cookie for some.com}
сервер это принимает, смотрит куки, видит что юзер авторизован. И начинает выполнять свои действия, потом отправляет результат обратно
{какой то хеадер ответа}

<h2>All messages from you mailbox are removed.</h2>
в результате:
картинка не отобразилась, потому что браузер получил не картинку
у юзера удалились все его сообщения из почтого ящика, и он этого не заметил
В этом и суть CSRF
Принятый ответ
0
22
10 лет назад
0
А разве пользователь не может отредактировать атрибуты input'ов в форме и отправить то же самое?
+
Хотя в таком случае какой смысл делать токен? >_<
0
29
10 лет назад
0
bladget, может, но речь идет не об этом. Ты сейчас говоришь о простой валидации инпута, смотри вше что я тебе написал. Речь идет о том, что кто-то чужой, который не имеет доступа к этой ссылке подсунул тебе, а ты даже и не заметил этого. Если я тебе плохо объяснил все в прошлом посте, попробуй почитать на вики
0
22
10 лет назад
0
Я уже много где читал, в т. ч. на Вики. Видимо где-то приянл во внимание вредный совет. Я всё понял, спасибо.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.