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 для получения более подробной информации

Вернуться на верх