Forbidden (CSRF token missing or incorrect.)

在使用Django时,遇到403错误,提示'CSRF token missing or incorrect.'。该问题源于Django默认的安全设置,它要求POST请求包含一个有效的CSRF token。解决方案包括禁用CSRF保护或正确地在前端表单中添加并处理CSRF token。了解原因和解决方案对于防止跨站请求伪造攻击至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

写了个静态页面,可以正常访问,然后在静态页面加了form表单,输入用户名,密码,在views中获取并打印,点击提交时就报错403,特此再次补充下,之前写过一篇相同的问题。

后台报错:

Forbidden (CSRF token missing or incorrect.): /index/
原因分析:

django的默认配置中设置了跨站请求的限制,并将其禁止的状态,form表单在提交时,除了常用的字段之外,额外添加一个token ,这个token是服务器端生成的,是一个随机的数字。服务器端就会检查从浏览器发过来的数据中有没有token,并且这个token的值是不是和服务器端保存的相等,如果相等,就继续执行操作,如果不相等,那这次POST请求肯定是伪造的。

解决方案:

方案一:将settints中对于跨站请求的限制注掉,风险在于那些通过基于受信任的输入form和对特定行为无需授权的已认证的用户来执行某些行为的web应用。已经通过被保存在用户浏览器中的cookie进行认证的用户将在完全无知的情况下发送HTTP请求到那个信任他的站点,进而进行用户不愿做的行为。
在这里插入图片描述

### 解决DjangoCSRF Token Missing导致的CSRF Verification Failed问题 当遇到`Forbidden (CSRF token missing or incorrect.)`错误时,通常意味着客户端发送给服务器的请求未携带有效的CSRF令牌。为了确保安全性并修复此问题,在HTML模板中的表单部分应加入CSRF令牌[^1]。 对于基于函数视图的情况,如果使用的是GET方法,则无需特别处理;但对于POST请求而言,需保证每个涉及数据修改操作的页面都含有如下代码片段: ```html <form method="post"> {% csrf_token %} <!-- 表单项 --> </form> ``` 上述代码通过调用模板标签`{% csrf_token %}`来嵌入隐藏字段,该字段包含了用于验证的CSRF令牌[^2]。 另外一种情况是在AJAX请求场景下,此时应在HTTP头信息里附加X-CSRFToken键值对。可以通过JavaScript获取cookie中的csrf-token,并将其设置到ajaxSetup全局配置项下的headers属性内,以便自动应用于所有的Ajax请求之中[^3]。 ```javascript $.ajaxSetup({ beforeSend: function(xhr, settings) { if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type)) { var csrftoken = Cookies.get('csrftoken'); xhr.setRequestHeader("X-CSRFToken", csrftoken); } } }); ``` 值得注意的是,虽然可以选择禁用中间件`'django.middleware.csrf.CsrfViewMiddleware'`的方式来绕过这个问题,但这并不是推荐的做法,因为这会降低应用程序的安全性。相反,应当按照官方文档指导正确集成CSRF保护机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值