django笔记,django 403
学习笔记,仅供参考,有错必纠。
本文以目录中间件中间件跨站点请求防伪造方案为例。
中间件
跨站请求伪造
跨站请求伪造攻击一些恶意网站包含链接、表单按钮或JavaScript,它们会试图利用浏览器中登录用户的认证信息来完成我们网站上的一些操作,这就是所谓的跨站请求伪造。
csrf跨站点请求伪造
跨站点请求伪装CSRF中间件和模板标签提供了简单的保护来防止跨站点请求伪造,这可以防止其他表单被提交到我们的Django服务器。
保护方案
在settings.py文件的中间件列表中取消csrf验证(不推荐)并删除(注释)django . MIDDLEWARE . csrf . csrfviewmedimiddleware的中间件。
验证@csrf_protect装饰器是否已添加到视图处理程序中。
@csrf_protect
def post_views(请求):
及格
通过验证向表单添加标签(最常用)
{% csrf_token %}
例如
先打开settings.py,打开CSRF中间件的评论:
中间件=[
django . middleware . security . security middleware ,
django . contrib . sessions . middleware . session middleware ,
django . middleware . common . common middleware ,
django . middleware . csrf . csrfviewmiddleware ,
django . contrib . auth . middleware . authenticationmiddleware ,
django . contrib . messages . middleware . message middleware ,
django . middleware . click jacking . xframeoptions middleware ,
# my middleware . check log in . my middleware ,
# my middleware . check log in . visit limit ,
]
我们向登录界面http://127 . 0 . 0 . 1:8000/userinfo/log in/发出请求并登录。点击登录后,网页产生403错误(无请求权限):
它告诉我们CSRF令牌丢失或不正确。
现在,为了能够成功地提交数据,我们需要向提交表单的模板添加一个标识符:
!声明文档类型
html lang=en
头
meta charset=UTF-8
标题登录/标题
/头
身体
表单操作=/userinfo/login/方法=POST
{% csrf_token %}
差异
标签用户名/标签
输入类型=文本名称=用户名
value={{用户名}}
/div
差异
标签密码/标签
输入类型=密码名称=密码
/div
差异
=id_remember 记住密码的标签/标签
输入类型=复选框名称=记住 id= id _记住
值=1
/div
差异
输入类型=提交值=登录
/div
/表单
/body
/html现在,我们再次向登录界面http://127 . 0 . 0 . 1:8000/userinfo/log in/发出请求,登录:
如您所见,我们正常登录。
我们来看看登录界面的网页源代码:
!声明文档类型
html lang=en
头
meta charset=UTF-8
标题登录/标题
/头
身体
表单操作=/userinfo/login/方法=POST
input type= hidden name= csrfmiddlewaretoken value= 7 aze 5 tzgsdrf 6 bqkn 9 jlfbzgtjox 0 fvqhdbzeteeo 2 datmstyjoy 6 gy 8 vwsqi 9 PP
差异
标签用户名/标签
输入类型=文本名称=用户名
值=
/div
差异
标签密码/标签
输入类型=密码名称=密码
/div
差异
=id_remember 记住密码的标签/标签
输入类型=复选框名称=记住 id= id _记住
值=1
/div
差异
输入类型=提交值=登录
/div
/表单
/body
/html我们发现CSRF令牌标记自动生成了一个输入标记:
type= hidden name= csrfmiddlewareken value= 7 aze 5 tzgsdrf 6 bqkn 9 jlfbgtjox 0 fvqhdbzeteo 2 datmstyjoy 6 gy 8 vwsqi 9 PP value参数后的字符串是Django服务器提供给我们的密钥。如果提交的表单中没有包含这串密钥,或者提供的密钥与Django给我们的密钥不一致,就不会提交成功,起到了防止其他网站恶意向我们提交数据的保护作用。
温馨提示:当我们在settings.py中设置CSRF中间件,并在表单form中添加CSRF令牌标签时。那么如果不是我们服务器发布的表单,而是其他向我们提交数据的网站发布的表单,就不会提交成功。
转载请联系作者获得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。