前言
CSRF全称Cross-site request forgery(跨站请求伪造),是一种网络的攻击方式,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF。
攻击原理
1、用户访问正常的网站A,浏览器就会保存网站A的cookies。
2、用户在访问恶意网站B, 网站B上有某个隐藏的链接会自动请求网站A的链接地址,例如表单提交,传指定的参数。
3、恶意网站B的自动化请求,执行就是在用户A的同一个浏览器上,因此在访问网站A的时候,浏览器会自动带上网站A的cookies。
4、所以网站A在接收到请求之后,可判断当前用户登录状态,所以根据用户的权限做具体的操作逻辑。
防范措施
1、在指定表单或者请求头的里面添加一个随机值做为参数。
2、在响应的cookie里面也设置该随机值。
3、用户正常提交表单的时候会默认带上表单中的随机值,浏览器会自动带上cookie里面的随机值,那么服务器下次接受到请求之后就可以取出两个值进行校验。
4、对于网站B来说网站B在提交表单的时候不知道该随机值是什么,所以就形成不了攻击。
Django中CSRF中间件
django在创建项目的时候,默认就会有添加中间进行CSRF的保护,在MIDDLEWARE可以看到加载了 django.middleware.csrf.CsrfViewMiddleware 的中间件,这里是全局设置,也可以局部设置。
全局保护:直接启用中间件就可以了。
局部保护: from django.views.decorators.csrf import csrf_exempt,csrf_protect
,使用装饰器进行验证。
csrf_protect
:为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件;
csrf_exempt
:取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
验证
在POST请求提交数据的时候,django会去检查是否有一个csrf的随机字符串,如果没有就会返回403没有权限访问。
表单验证
在form表单里面需要添加{%csrf_token%},Django会自动渲染隐藏的input输入框:
<input type="hidden" name="csrfmiddlewaretoken" value="2Sb0DQwDVgOQ8i3n1BaG1MUPLEYr6ZGaCLYa14maOQM0Ami5ddQOR6hfXuD2mrmA">
在表单提交的时候,中间件会验证csrfmiddlewaretoken。
通过ajax提交
通过cookies获取到csrftoken,
function getCookie(name) { var r = document.cookie.match("\\b" + name + "=([^;]*)\\b"); return r "/api/v1.0/orders", type:"POST", data: JSON.stringify(data), contentType: "application/json", dataType: "json", headers:{ "X-CSRFtoken":getCookie("csrf_token"), },
局部禁用或者启用
1、如果是函数视图,可以直接在函数加上装饰器即可:
from django.views.decorators.csrf import csrf_exempt,csrf_protect @csrf_exempt def login(request): if request.method == 'GET': return render(request,'login.html') else: return HttpResponse('ok')
2、如果是类视图,需要使用方法装饰器进行封装
from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt,csrf_protect from django.views.generic import TemplateView @method_decorator(csrf_exempt) class LoginView(TemplateView): template_name = 'login.html' def post(): return HttpResponse('ok')
3、直接装饰as_view()方式,在URLconf里面设置。
from django.views.decorators.csrf import csrf_exempt,csrf_protect urlpatterns = [ path('login/', csrf_exempt(LoginView.as_view()),name="login"), ]
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。