jquery — защита CSRF в переполнении стека

У меня есть несколько сценариев PHP POST, которые мне нужны для защиты от CSRF-атак, и у меня есть несколько вопросов:

1) Если я отправляю POST-запросы в PHP с помощью jquery без HTML-формы, просто получаю значения непосредственно из элементов HTML и отправляю их с помощью jquery, я все еще подвержен риску CSRF?

2) Когда пользователь входит на сайт, я сохраняю его уникальный токен в переменной сеанса. В скрипте PHP POST я проверяю, установлена ​​ли эта переменная сеанса и имеет ли она то же значение, которое я установил ранее. Разве этого не достаточно? почему токен также должен быть включен в HTML-форму?

Спасибо

1

Решение

  1. Да. Не имеет значения, как вы строите запрос, злоумышленник может создать его таким же образом. (Теоретически вы можете сделать функции сложного запроса (которые вызовут предварительный запрос CORS) обязательными, чтобы другой сайт не мог заставить браузер пользователя дублировать весь запрос, но я бы не хотел зависеть от этого) ,
  2. нет

Смысл токена заключается в том, чтобы убедиться, что страница, которая содержит код, отвечающий за решение, что входит в запрос (например, форму или JavaScript), является страницей на вашем веб-сайте.

Если форма (или JavaScript) может считывать токен (который совпадает с токеном в сеансе) из HTML страницы и помещать его в запрос, то вы знаете код, который сконструировал запрос, пришедший с вашего сайта.

Если вы просто проверяете, что он находится в сеансе, то все, что вы проверяете, это то, что пользователь вызвал создание токена (что обычно означает просто посещение любой страницы вашего сайта… которая может находиться в скрытом фрейме).

3

Другие решения

  1. Да это все еще небезопасно

  2. Токен CSRF должен быть только что сгенерированным токеном при каждом создании формы. Он должен быть уникальным и непредсказуемым для каждого запроса. Токен сеанса, установленный при входе в систему, является уникальным только для всего зарегистрированного сеанса.

И если вы не публикуете сгенерированный токен для проверки, где вы его проверяете? Вы сопоставляете маркер сеанса с …? Причина в том, что вы все еще можете дать людям возможность подделать запрос, если токен не отправлен вместе с самим запросом, но все проверки выполняются с помощью сеанса / файлов cookie. Если вы проверяете только сеанс, он ничего не делает против csrf. Его нужно отправить в самом запросе и проверить, соответствует ли он вашему сеансу. Когда вы генерируете уникальный токен для каждого запроса, злоумышленники не могут подделать чей-то запрос.

1