Forbidden (DisallowedHost at /login)和 (CSRF token missing or incorrect.)的问题

本文介绍了在Django中遇到DisallowedHost和CSRF错误的解决方法。当收到'Invalid HTTP_HOST header'警告时,可以通过将IP地址添加到ALLOWED_HOSTS列表中来解决。对于'CSRF token missing or incorrect.'问题,解决方案是在表单中添加{% csrf_token %}标签,并解释了CSRF的工作原理。

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

DisallowedHost at /login
Invalid HTTP_HOST header: ‘192.168.1.37:8000’. You may need to add ‘192.168.1.37’ to ALLOWED_HOSTS.
Request Method: GET
Request URL: http://192.168.1.37:8000/login
Django Version: 2.2.7
Exception Type: DisallowedHost

出现这个报错的时候,第一个方法是关闭CSRF防护,在setting里注释掉第三行。

MIDDLEWARE = [
‘django.middleware.security.SecurityMiddleware’,
‘django.contrib.sessions.middleware.SessionMiddleware’,
#‘django.middleware.common.CommonMiddleware’,
‘django.middleware.csrf.CsrfViewMiddleware’,
‘django.contrib.auth.middleware.AuthenticationMiddleware’,
‘django.contrib.messages.middleware.MessageMiddleware’,
‘django.middleware.clickjacking.XFrameOptionsMiddleware’,
]

然后就会报下面的错:
Forbidden (CSRF token missing or incorrect.)

在form后面加上{% csrf_token %} 就可以了

用户名:<form method="post" action="/login_check"> {% csrf_token %}
<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">

原理:
在渲染页面的时候,会将 {% csrf_token %} 替换成
这个隐藏域;
服务器交给浏览器保存一个名字为csrftoken的cookie信息;
提交表单时,两个值都会发给服务器进行对比,如果一样,csrf验证通过,否则失败。

但是,关闭CSRF是不安全的,还是把setting里的注释取消,将ALLOWED_HOSTS = [’’] 改为
ALLOWED_HOSTS = [’*’]

允许所有的主机,或是将自己电脑的ip地址加入ALLOWED_HOSTS = [’*’]中,这个方法也可以。

### 解决Django中CSRF 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、付费专栏及课程。

余额充值