【问题标题】:Django - What happens when a csrf_token is NOT re-submitted to the server?Django - 当 csrf_token 没有重新提交到服务器时会发生什么?
【发布时间】:2021-11-05 19:31:58
【问题描述】:

大家好。

我想知道... 当服务器端应用程序以 HTML 表单将 csrf_token 提交给浏览器时,会发生什么情况?而浏览器没有随帖子提交该表单?

因为我在想... Django 制作 csrf_token 并将其与用户或会话相关联,我不确定是否在它返回时检查它。然后我认为它会删除它,对吗?那如果不回来怎么办? 它会一直留在那里等到会话结束或这是导致漏洞的错误还是什么?

对于示例,我想在对象的详细信息下为Comments制作一个表单。但这不是必须评论的。如果需要,您可以发表评论,而您不能这样做。所以我在这些细节下放了一个这样的表格:

<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>

【问题讨论】:

    标签: django http security django-templates csrf


    【解决方案1】:

    CSRF 令牌数据存在于请求会话或 cookie 中,具体取决于您的设置。

    当您执行{% csrf_token %} 时,会将相同的令牌放入表单的隐藏字段中,以便将其发送回服务器。
    服务器只会比较它是否与 sesssion/cookie 中的内容相匹配。

    对 AJAX 请求也做了类似的事情,但它不是包含在正文中,而是标题的一部分。

    如果您使用CSRF_USE_SESSIONS = True 或CSRF_COOKIE_HTTPONLY = True,则无法通过 JavaScript 访问令牌,因此非常安全。

    令牌本身是随机生成的,并在用户的整个会话中使用(即,如果他们注销并再次登录,则会生成不同的令牌)。

    所以要回答您的问题,如果未提交表单,则不会发生任何事情。只要用户登录,CSRF 令牌就会继续存在于 session/cookies 中。

    更多详情请参考Django Docs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      相关资源
      最近更新 更多