У меня есть несколько сценариев PHP POST, которые мне нужны для защиты от CSRF-атак, и у меня есть несколько вопросов:
1) Если я отправляю POST-запросы в PHP с помощью jquery без HTML-формы, просто получаю значения непосредственно из элементов HTML и отправляю их с помощью jquery, я все еще подвержен риску CSRF?
2) Когда пользователь входит на сайт, я сохраняю его уникальный токен в переменной сеанса. В скрипте PHP POST я проверяю, установлена ли эта переменная сеанса и имеет ли она то же значение, которое я установил ранее. Разве этого не достаточно? почему токен также должен быть включен в HTML-форму?
Спасибо
Смысл токена заключается в том, чтобы убедиться, что страница, которая содержит код, отвечающий за решение, что входит в запрос (например, форму или JavaScript), является страницей на вашем веб-сайте.
Если форма (или JavaScript) может считывать токен (который совпадает с токеном в сеансе) из HTML страницы и помещать его в запрос, то вы знаете код, который сконструировал запрос, пришедший с вашего сайта.
Если вы просто проверяете, что он находится в сеансе, то все, что вы проверяете, это то, что пользователь вызвал создание токена (что обычно означает просто посещение любой страницы вашего сайта… которая может находиться в скрытом фрейме).
Да это все еще небезопасно
Токен CSRF должен быть только что сгенерированным токеном при каждом создании формы. Он должен быть уникальным и непредсказуемым для каждого запроса. Токен сеанса, установленный при входе в систему, является уникальным только для всего зарегистрированного сеанса.
И если вы не публикуете сгенерированный токен для проверки, где вы его проверяете? Вы сопоставляете маркер сеанса с …? Причина в том, что вы все еще можете дать людям возможность подделать запрос, если токен не отправлен вместе с самим запросом, но все проверки выполняются с помощью сеанса / файлов cookie. Если вы проверяете только сеанс, он ничего не делает против csrf. Его нужно отправить в самом запросе и проверить, соответствует ли он вашему сеансу. Когда вы генерируете уникальный токен для каждого запроса, злоумышленники не могут подделать чей-то запрос.