2014-01-31 1 views
21

Что нужно, чтобы положить CSRF токен имя и значение внутри < головки > тег используя < мета > как:Почему токен CSRF должен быть в метатеге и в cookie?

например:

<meta content="authenticity_token" name="csrf-param" /> 
<meta content="4sWPhTlJAmt1IcyNq1FCyivsAVhHqjiDCKRXOgOQock=" name="csrf-token" /> 

Я прочитал о концепции сохраняйте значение CSRF в cookie, но не можете найти причину, по которой следует хранить внутри <head> тег.

ответ

14

К prevent CSRF вам нужно значение, которое отправляется с запросом, который не может быть отправлен вредоносным сайтом. Файлы cookie подлинности не подходят, потому что если злоумышленник может заставить браузер отправить запрос на сайт жертвы, файлы cookie будут автоматически отправлены.

Например, путем подачи формы с помощью JavaScript, содержащуюся на www.evil.com атаковать сеанс пользователя на www.example.com:

<form method="post" action="https://www.example.com/executeAction"> 
    <input type="hidden" name="action" value="deleteAllUsers"> 
</form> 

<script>document.forms[0].submit()</script> 

Сохранение анти маркер CRSF в пределах страницы является OWASP рекомендуемым решением для предотвращения другого веб-сайта от представления форма, так как случайный токен в сеансе пользователя не может быть прочитан www.evil.com из-за Same Origin Policy, предотвращающий JavaScript на www.evil.com, считывая содержимое страницы www.example.com.

Эти жетоны можно хранить в любом месте страницы. Чаще всего он будет находиться в скрытых формах, но они также могут быть сохранены в пределах HTML 5 data- attributes. Похоже, использование тегов meta - это просто другой способ, которым он может быть сохранен, где JavaScript может включать его в любые формы, предоставляемые страницей.

+0

'www.evil.com', вы не сможете получить точный токен пользователя из 'www.example.com', даже если SOP ** отключен ** (т. е. запрос от' www.evil.com' является отдельной сессией, поэтому должен быть создан новый токен). – rakeen

+0

Это тот же сеанс, если используется тот же экземпляр браузера (конечно, использование инкогнито или частного режима просмотра). – SilverlightFox

+0

Как «www.example.com» знает, если это тот же сеанс? Запрос от 'www.evil.com' не имеет никакого токена. – rakeen

1

Единственный вариант, который я мог представить, - сделать доступ к данным доступным из JavaScript. Причина в том, что файлы cookie только http.

+0

Хорошо, я понял, но все же я в замешательстве. Большое спасибо. – vinaykrsharma

+0

Если мой ответ помог вам, пожалуйста, не забудьте принять его. – rekire

2

Это потому, что нет ничего, что помешает оскорбительному веб-сайту из POSTing данных на законный веб-сайт, который может включать ваш билет аутентификации и ваш токен CSRF. Представьте себе этот сценарий ... взято с ASP.NET

  1. Пользователь регистрируется на www.siteA.com, используя проверку подлинности на основе форм.
  2. Сервер аутентифицирует пользователя. Ответ с сервера включает в себя файл cookie аутентификации.
  3. Без выхода из системы пользователь посещает вредоносный веб-сайт. Этот вредоносный сайт содержит следующую форму HTML:

    <h1>You Are a Winner!</h1> 
        <form action="http://siteA.com/api/account" method="post"> 
         <input type="hidden" name="Transaction" value="withdraw" /> 
         <input type="hidden" name="Amount" value="1000000" /> 
    <input type="submit" value="Click Me"/> 
        </form> 
    

Обратите внимание, что сообщения формы действий на уязвимом месте, а не на вредоносный сайт. Это «кросс-сайт» части CSRF.

Пользователь нажимает кнопку отправки. В обозревателе указан файл cookie проверки подлинности с запросом. Запрос выполняется на сервере с использованием контекста аутентификации пользователя и может выполнять все, что разрешен для аутентифицированного пользователя.

Таким образом, в случае, если сайтA.com получает атаку CSRF, он должен соответствовать токену CSRF в файле cookie, противоположному таковому в метатеге. В законный запрос будут включены оба, однако атака подделки будет включать только токен CSRF, указанный в файле cookie.

9

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

Вы не захотите помещать маркер CSRF в файл cookie, потому что cookie будет отправляться для каждого запроса на конкретный веб-сайт из веб-браузера независимо от его происхождения. Единственным исключением будет безопасных файлов cookie, которые должны следовать политике одного и того же происхождения.

+0

При хранении токена XSRF в файле cookie. Если при отправке запроса я устанавливаю заголовок X-XSRF-TOKEN и проверяю, что сторона сервера заголовка игнорирует файл cookie – DevEng

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