CSRF验证报错:WARNING Forbidden (CSRF cookie not set.): /

一、发现问题:
日志中每隔10分钟会出现一次’WARNING Forbidden (CSRF cookie not set.): /'报错。

#setting中设置日志格式如下:
logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(pathname)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S',
                    filename='./serverlog2023.log',
                    filemode='a'
                    )
#serverlog2023.log中提示:
2023-05-05 15:14:53 C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\django\middleware\csrf.py[line:160] WARNING Forbidden (CSRF cookie not set.): /

根据WARNING 提示找到csrf.py的160行, ‘Forbidden (%s): %s’, reason, request.path,,发现request.path打印为‘/’,并没有函数路径,无法定位到是哪个函数请求缺少csrf验证。

 def _reject(self, request, reason):
        logger.warning(
            'Forbidden (%s): %s', reason, request.path,
            extra={
                'status_code': 403,
                'request': request,
            }
        )
        return _get_failure_view()(request, reason=reason)

二、尝试操作:
路径为空,猜测是主程序的请求问题,按照网上的方法,把view.py中所有含“request.method == ‘POST’:”的函数前都加上@csrf_exempt,前端html中所有含method="post"的form标签都加上 {% csrf_token %},仍然报错。

三、解决方案:
根据路径"/",在url.py中找到url(r’^$', lrsupport.views.home, name=‘home’),对应函数是home(),加上@csrf_exempt,停止WARNING 。

@csrf_exempt   
def home(request):
    c = csrf(request)
    return render_to_response('home.html', context=c)

四、原因解析:
在Django中,csrf(request)函数用于生成和验证CSRF令牌。CSRF(Cross-Site Request Forgery)是一种攻击方式,攻击者通过伪造用户的请求来执行恶意操作。

在视图函数中,可以使用csrf(request)函数来验证CSRF令牌。例如:

from django.shortcuts import render
from django.views.decorators.csrf import csrf_protect

@csrf_protect
def my_view(request):
    if request.method == 'POST':
        # 验证CSRF令牌
        c = csrf(request)
        if not c:
            # CSRF验证失败,处理逻辑
            return render(request, 'csrf_error.html')
        else:
            # CSRF验证成功,处理逻辑
            return render(request, 'success.html')
    else:
        # GET请求处理逻辑
        return render(request, 'form.html')

在上述示例中,@csrf_protect装饰器用于开启CSRF保护。当请求为POST方法时,会调用csrf(request)函数来验证CSRF令牌。如果验证失败,则返回一个错误页面;如果验证成功,则执行相应的处理逻辑。

需要注意的是,为了使CSRF保护生效,你需要在HTML表单中添加CSRF令牌。可以使用Django模板中的{% csrf_token %}标签来生成CSRF令牌。例如:

<form method="post" action="/my_view/">
    {% csrf_token %}
    <!-- 其他表单字段 -->
    <input type="submit" value="提交">
</form>

在上述示例中,{% csrf_token %}标签会生成一个隐藏的input字段,其中包含了CSRF令牌。当表单提交时,CSRF令牌会被包含在请求中,从而进行验证。

通过以上步骤,你可以在Django中进行CSRF保护,并使用csrf(request)函数来验证CSRF令牌。
原来需要验证的不是“request.method == ‘POST’:”请求,而是csrf(request)这一句。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个误是由于Django的CSRF保护机制引起的,它需要确保每个POST请求都具有与会话关联的CSRF令牌。 在Django中,每个POST请求都需要在请求中包含一个名为`csrfmiddlewaretoken`的CSRF令牌。如果请求中不包含这个令牌,Django会抛出`Forbidden (CSRF cookie not set.)`误。 为了解决这个问题,您需要在POST请求的表单中包含CSRF令牌。例如,在您的HTML表单中,可以添加以下代码: ```html {% csrf_token %} ``` 这将在表单中添加一个隐藏字段,其中包含与当前会话关联的CSRF令牌。当用户提交表单时,这个令牌将与请求一起发送,以通过CSRF保护。 如果您使用的是AJAX请求,可以将CSRF令牌作为请求头发送。例如,在JavaScript中,可以添加以下代码: ```javascript function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie !== '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = cookies[i].trim(); if (cookie.substring(0, name.length + 1) === (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } var csrfToken = getCookie('csrftoken'); $.ajax({ ... headers: { 'X-CSRFToken': csrfToken }, ... }); ``` 这将在请求头中添加一个名为`X-CSRFToken`的头,其中包含与当前会话关联的CSRF令牌。这样,您的AJAX请求将通过CSRF保护。 请注意,如果您使用的是第三方库或框架,例如Django REST framework或jQuery,它们可能会自动处理CSRF令牌。在这种情况下,您不需要手动添加CSRF令牌。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值