2015-09-24 6 views
0

В настоящее время я добавляю механизм защиты маркера CSRF в мое приложение php. Как я читал, единственным требованием является уникальный токен для каждого пользователя, который я генерирую с использованием random_bytes в php7.Глубокая защита CSRF

Я беспокоюсь, если злоумышленник отправляет HTTP-запрос с использованием браузера пользователя, так или иначе браузер не будет отправлять переменную сеанса токена? (поскольку у пользователя есть sessionid, связанный с токеном).

Я храню токен внутри скрытого значения, полученного от переменной сеанса.

Например: мой токен хранится внутри переменной сеанса, а затем злоумышленник отправляет меня на страницу с паролем с защитой csrf, проверка не пройдет? (У меня уже есть правильный идентификатор сеанса в моих браузерах).

Благодаря

+0

Если вы храните маркеры на стороне клиента (например, в файле cookie), или вы храните его на стороне сервера в массиве сеансов, но все, что требуется от клиент - это идентификатор сеанса, вы делаете это неправильно. Маркер должен быть помещен как скрытое поле во все формы на вашем веб-сайте, которые выполняют действие, которое вы не хотели бы повторять или подражать злоумышленнику. См. Https://www.acunetix.com/websitesecurity/csrf-attacks/ – Mike

+0

Кроме того, другим требованием является использование HTTPS. –

ответ

1

Вот как атака CSRF работы:

Алиса (вольно или невольно) посещения compromised.com

compromised.com делает HTTP пост & кинжалом; запросите yoursite.com, используя форму HTML или JavaScript или Flash или что-то еще, что может сделать HTTP-запрос.

<form method=post action="http://yoursite.com/change-password"> 
    <input name=password value=666> 
    <input name=confirm_password value=666> 
</form> 

Это работает потому, что веб-браузер отправляет yoursite.com куки сессии Алисы в yoursite.com.

Благодаря Same-origin policy, compromised.comможет отправить любые данные, которые он хочет любой сайт, но не может читать данных с других сайтов.

Вот как работает защита CSRF:

yoursite.com требует переменной запроса после HTTP под названием _csrf_token (или аналогичный) и сравнивает его с тем, что вы сохранили для Алисы в стороне сервера памяти сеанса.

Вы пишете значение в скрытый ввод в вашей HTML-форме _csrf_token «s, поэтому он автоматически передается с формой сообщениями от yoursite.com

compromised.comне может прочитать значения _csrf_token из yoursite.com вследствие общего происхождения политики, поэтому его попытки опубликовать до yoursite.com не удастся.

<form method=post action="http://yoursite.com/change-password"> 
    <input name=password value=666> 
    <input name=confirm_password value=666> 
    <input name=_csrf_token value="???"> 
</form> 

& dagger; это не обязательно должно быть, но это общепринято.

+0

То, что мне было нужно. это означает, что простое эхо из хранения и проверки сеанса будет очень хорошо предотвращать CSRF? Спасибо! –

+0

Yup, просто напишите значение токена csrf из сеанса в ваши html-формы и проверьте его на значение в памяти сеанса, когда пользователь пытается отправить форму. –

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