2014-11-15 8 views
1

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

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

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

Благодаря

ответ

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

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

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

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

+0

ОК. что если у злоумышленника есть JS, который может включать фактическую HTML-форму с моего сайта в скрытый iframe. Я видел это в другом примере: не будет ли токен включен в форму, если пользователь посещает веб-сайт злоумышленника во время входа в систему? В этом случае запрос будет аутентичным, поскольку токен есть в форме и в сеансе, или я чего-то не хватает? –

+0

Нет. Если вы поместите рамку внутри формы, поля на странице, загруженной фреймом, не будут включены в данные формы. Вы не можете читать данные через домены через фрейм с JavaScript (если только сайт не сотрудничал с postMessage, которого вы не были бы). – Quentin

+0

извините, что вы имеете в виду под рамкой внутри формы?я имею в виду наоборот, формируем внутри фрейма –

1
  1. Да, это по-прежнему небезопасно

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

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

Смежные вопросы