Django - Что происходит, когда csrf_token НЕ повторно отправляется на сервер?
Привет всем.
Мне интересно... Что происходит, когда csrf-токен отправляется приложением на стороне сервера браузеру в HTML-форме, и эта форма не была отправлена браузером вместе с сообщением?
Потому что я подумал... Django создает csrf_token и связывает его с пользователем или с сессией, я не уверен, чтобы проверить его, когда он вернется. А затем, я думаю, он удаляет его, верно? А что, если он не вернулся? Он останется там, ожидая окончания сессии или Это ошибка, которая вызывает уязвимость или что?
Для Примера, я хочу сделать форму для Комментариев под деталями объекта. Но комментировать не обязательно. Вы можете комментировать, если вам нужно, и вы можете не так делать. Поэтому я поместил такую форму под этими деталями :
<div class="container">
<!-- Here is the object data -->
</div>
<div class="container comments">
<ul>
<li>
<form action="{% url 'ads:newcomment' %}" method="POST">
{% csrf_token %}
<input id="comment_txt" name="comment" type="text" value="Type a comment..." class="comment_txt"/>
</form>
</li>
{% for comment in comments %}
<li class="comment">{{comment}}</li>
{% endfor %}
</ul>
</div>
Данные маркера CSRF живут в сессии запроса или в cookies в зависимости от ваших настроек.
Когда вы делаете {% csrf_token %}
, тот же токен помещается в скрытое поле вашей формы, чтобы он был отправлен обратно на сервер.
Сервер просто сравнит, что это совпадает с тем, что было в sesssion/cookie.
Аналогично поступают и с AJAX-запросами, но вместо того, чтобы включать его в тело, он является частью заголовков.
Если вы используете CSRF_USE_SESSIONS = True
или CSRF_COOKIE_HTTPONLY = True
, токен не может быть доступен через JavaScript, так что это довольно безопасно.
Сам токен генерируется случайным образом и используется на протяжении всей сессии пользователя (т.е. при выходе из системы и повторном входе будет сгенерирован другой токен).
Итак, чтобы ответить на ваш вопрос, если форма не отправлена, ничего не произойдет. Токен CSRF будет продолжать существовать в сессии/кукисах до тех пор, пока пользователь входит в систему.
Обратитесь к Django Docs для получения более подробной информации