Как предотвратить CSRF-атаки, когда действие CRUD использует ссылку вместо формы? - PullRequest
1 голос
/ 27 января 2012

Я реализовал защиту CSRF на своем веб-сайте, используя токен CSRF в скрытом поле ввода в моих формах. Однако в некоторых местах на моем веб-сайте я не использую форму для определенных действий, например, пользователь может щелкнуть ссылку, чтобы удалить что-то (например, /post/11/delete). В настоящее время это открыто для атаки CSRF, поэтому я хочу реализовать предотвращение для этих ссылок. Как я могу это сделать? Я могу придумать два возможных пути:

  1. Сделайте все ссылки (которые, например, что-то удаляют) в крошечные формы только с одним скрытым полем (токен CSRF) и одной кнопкой отправки (стилизованной как обычная ссылка).
  2. Добавить токен CSRF в строку запроса

Мне не нравится ни один из этих вариантов:

  1. У стиля кнопки отправки, действующей точно так же, как ссылка, могут возникнуть некоторые проблемы при ее правильном использовании (кроссплатформенность)?
  2. Хотя он никогда не будет подхвачен поисковыми системами и ему не нравятся случайные строки в моем URL (только эстетика).

Так есть ли способ, которым я упускаю или эти два моих варианта?

Ответы [ 3 ]

2 голосов
/ 29 января 2012

Добавьте токен к своим ссылкам.


  1. стилизация, чтобы представить, что ссылка не сложная.Хотя будут проблемы со средним щелчком или командой «копировать местоположение ссылки».Очевидно.

  2. facebook / google не боятся вставлять «случайные строки» в URL.Как и вы.(Добавление nofollow к этим ссылкам и исключение их в файле robots.txt должно решить ваши опасения с помощью SEO. Это в случае, если вы по какой-то причине покажите ссылки REST для гостевых пользователей / поисковых систем ).

1 голос
/ 30 января 2012

Если вам действительно не нужны параметры URL с длинными случайными значениями, вы можете создать страницу подтверждения для каждого действия «Удалить» и создать там форму со скрытым полем.Запросы, полученные в / post / 11 / delete без действительного токена, заставят сервер ответить страницей подтверждения.Запросы, полученные в / post / 11 / delete с действующим токеном, приведут к удалению.

0 голосов
/ 19 ноября 2013

Рекомендуется не выполнять обновления с помощью операции GET.

Вот небольшой умный скрипт, который подключит все ваши ссылки и сделает их POST единственной скрытой переменной в дополнение к полезной нагрузке в строке запроса.Надеюсь, это полезно!

document.ready = function () {
    var makeLinkPost = function(link) {
        var handleClick = function(event) {
            event.preventDefault();
            $("<form action='" + this.href + "' method='POST'><input type='hidden' value='CSRF'/></form>'").appendTo("body").submit();
        }
        $(link).click(handleClick);
    }

    $("a").each(function() {
        makeLinkPost(this);
    })
}    
...