Это может стать примером CSRF, если:
- эта ссылка выбрана (например, с помощью тега
<img>
) : подделка
- с другого сайта: кросс-сайт
Например, если бы я мог вставить этот тег <img>
в исходный HTML-код stackoverflow (и я могу, поскольку stackoverflow позволяет использовать теги <img>
в своих сообщениях) :
<img src="http://mysite.com/vote/30" />
Вы бы просто проголосовали за этот пункт; -)
Решение, которое обычно используется, заключается в том, чтобы поместить токен с ограниченным сроком службы в URL-адрес и при получении URL-адреса проверить, что этот токен все еще действителен.
Основная идея будет:
- При создании страницы:
- Когда вызывается страница голосования:
- Проверьте, присутствует ли токен в URL
- Проверьте, присутствует ли он в сеансе пользователя
- Если нет => не регистрировать голос
Идея есть:
- Жетоны не имеют большой продолжительности жизни, и их трудно угадать
- Что означает ваш атакующий :
- имеет только окно в несколько минут, в течение которого его инъекция будет действительна
- должен уметь угадывать ^^
- придется создавать разные страницы для каждого пользователя.
Также обратите внимание, что чем короче сеанс пользователя остается активным после того, как он покинул ваш сайт, тем меньше риск того, что он остается действительным, когда он посещает плохой сайт.
Но здесь вы должны выбрать между безопасностью и простотой использования ...
Другая идея (это не совсем безопасно, но помогает против парней, которые не знают, как заставить запрос POST) , будет принимать запросы POST только тогда, когда люди голосуют:
- Браузер отправляет GET-запросы на введенные теги
- Поскольку этот URL изменяет некоторые данные, он не должен работать с GET, а только с POST
Но учтите, что это не совсем безопасно: (возможно?) можно принудительно / подделать POST-запрос с небольшим количеством Javascript.