Django,Ajax提交csrf_token处理

本文介绍了使用Ajax进行数据提交时如何正确携带CSRF令牌,包括两种方式:一是将CSRF令牌作为data参数的一部分;二是将CSRF令牌放置在请求头中。通过具体的HTML和JavaScript代码示例,展示了如何实现这一功能。
Ajax提交数据时候,携带CSRF:
a. 放置在data中携带

<form method="POST" action="/csrf1.html">
    {% csrf_token %}
    <input id="user" type="text" name="user" />
    <input type="submit" value="提交"/>
    <a onclick="submitForm();">Ajax提交</a>
</form>
<script src="/static/jquery-1.12.4.js"></script>
<script>
    function submitForm(){
        var csrf = $('input[name="csrfmiddlewaretoken"]').val();
        var user = $('#user').val();
        $.ajax({
            url: '/csrf1.html',
            type: 'POST',
            data: { "user":user,'csrfmiddlewaretoken': csrf},
            success:function(arg){
                console.log(arg);
            }
        })
    }

</script>
                
b. 放在请求头中
            
<form method="POST" action="/csrf1.html">
    {% csrf_token %}
    <input id="user" type="text" name="user" />
    <input type="submit" value="提交"/>
    <a onclick="submitForm();">Ajax提交</a>
</form>
<script src="/static/jquery-1.12.4.js"></script>
<script src="/static/jquery.cookie.js"></script>

<script>
    function submitForm(){
        var token = $.cookie('csrftoken');
        var user = $('#user').val();
        $.ajax({
            url: '/csrf1.html',
            type: 'POST',
            headers:{'X-CSRFToken': token},
            data: { "user":user},
            success:function(arg){
                console.log(arg);
            }
        })
    }
</script>

 

转载于:https://www.cnblogs.com/oldpai/p/9637774.html

Django模板中的 `{% csrf_token %}` 是一个用于防止跨站请求伪造(CSRF)攻击的安全机制。它通过在表单中嵌入一个随机生成的令牌(token),确保提交请求的来源是可信的,从而保护应用程序免受恶意攻击。 ### 工作原理 1. **生成令牌**:当客户端首次访问包含 POST 表单的页面时,Django 会在服务器端生成一个随机的 CSRF 令牌,并将其存储在 cookie 中。这个 cookie 的字段名为 `csrftoken` [^2]。 2. **嵌入令牌到表单**:在模板中使用 `{% csrf_token %}` 标签后,Django 会将生成的 CSRF 令牌以隐藏字段的形式插入到 HTML 表单中。例如,渲染后的 HTML 可能类似于: ```html <input type="hidden" name="csrfmiddlewaretoken" value="abc123xyz..."> ``` 这样,在用户提交表单时,该令牌会被一同发送到服务器 [^4]。 3. **验证令牌**:在处理 POST 请求时,Django 的中间件会检查请求中的 `csrfmiddlewaretoken` 字段值与 cookie 中的 `csrftoken` 字段值是否匹配。如果两者一致,则认为请求合法;否则,拒绝请求并返回 403 Forbidden 错误 [^2]。 4. **AJAX 请求支持**:对于 AJAX 发起的 POST 请求,需要在请求头中添加 `X-CSRFTOKEN` 字段,并将其值设置为 cookie 中的 `csrftoken` 值,以确保 CSRF 验证通过 [^2]。 ### 应用场景 - 在任何涉及 POST 请求的表单中都应使用 `{% csrf_token %}`,尤其是在处理敏感操作(如登录、支付或数据修改)时,以增强安全性。 - 如果项目启用了基于会话的 CSRF 验证(通过配置文件中的 `CSRF_USE_SESSIONS` 设置),则 Django 会从 session 中获取令牌值,而不是直接依赖 cookie [^3]。 ### 安全性保障 CSRF 令牌的作用在于确保请求确实是由用户主动发起的,而不是由第三方网站伪装用户的意图。通过这种方式,Django 能够有效防止黑客利用用户的浏览器向目标站点发送伪造的请求 [^5]。 ```python # 示例代码片段:Django 模板中的表单 <form method="post"> {% csrf_token %} <!-- 其他表单字段 --> <button type="submit">提交</button> </form> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值