CSRF引用学习
来源:互联网 发布:淘宝服装定制店怎么开 编辑:程序博客网 时间:2024/06/16 06:39
参考学习:
浅谈CSRF攻击方式
[科普]跨站请求伪造-CSRF防护方法
这是篇关于CSRF的英文权威文档
防御的总结如下:
1、服务器端进行CSRF防御
就是在客户端页面增加伪随机数
或者是表单验证码(就是在客户端页面增加伪随机数,就是对用户而言不方便)
更多的参考以上链接
2、客户端防御的方式就靠用户对安全性的重视程度了。
上面的参考文章示例是基于其他web框架,对于django而言,它为我们解决了这个后顾之忧
Cross Site Request Forgery protection for Django
在Django文档中说的很详尽(点击阅读)
在django中可以通过CsrfViewMiddleware
中间件和{% csrf_token %}
模版变量很方便的防止csrf攻击。
在django中使用步骤如下:
1、添加中间件
在settings.py的MIDDLEWARE_CLASSES
中添加csrf中间件,且必须放在CsrfResponseMiddleware
前面。如下:
当然你也可以在view
中设置django.views.decorators.csrf.csrf_protect
装饰器。
2、在模版中设置
在POST
<form action="" method="post">{% csrf_token %}
3、在视图函数中设置
在相应的视图函数中,确保使用django.core.context_processors.csrf
,这可以通过两种方式:
1、在
RequestContext
中使用django.core.context_processors.csrf
2、手动导入和使用处理器生成CSRF令牌并将其添加到模板上下文,如下:
from django.core.context_processors import csrffrom django.shortcuts import render_to_responsedef my_view(request):c = {}c.update(csrf(request))# ... view code herereturn render_to_response("a_template.html", c)
我们在走完上面的流程发现,出错了。。如下:
原因是在视图函数中少了一个装饰方法@csrf_protect
装饰方法:
而不是增加CsrfViewMiddleware就全面保护,您可以使用csrfprotect装饰,具有完全相同的功能,在特定的视图,需要保护。注意必须通过POST形式和{% csrftoken %}令牌才能对此有用。
AJAX
需要说明一点是,ajax POST请求有点特殊,因为你必须记住通过csrf令牌产生的数据添加到POST数据中,然后POST请求过去。对于这种形式有另一种处理的方法,就是在每个XMLHttpRequest
,设置自定义X-CSRFToken头作为CSRF令牌的值。,比如jQuery的ajaxSend
.
ajaxSend() 方法在 AJAX 请求开始时执行函数。它是一个 Ajax 事件。
语法:.ajaxSend([function(event,xhr,options)])
其中:
具体见这里
$(document).ajaxSend(function(event, xhr, settings) { 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 = jQuery.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) == (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } function sameOrigin(url) { // url could be relative or scheme relative or absolute var host = document.location.host; // host + port var protocol = document.location.protocol; var sr_origin = '//' + host; var origin = protocol + sr_origin; // Allow absolute or scheme relative URLs to same origin return (url == origin || url.slice(0, origin.length + 1) == origin + '/') || (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') || // or any other URL that isn't scheme relative or absolute i.e relative. !(/^(\/\/|http:|https:).*/.test(url)); } function safeMethod(method) { return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } if (!safeMethod(settings.type) && sameOrigin(settings.url)) { xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); }});
添加这一个javascript文件,该文件包含在你的网站将确保通过jQuery AJAX POST请求,将不会被CSRF保护。
详尽见文档
- CSRF引用学习
- CSRF学习笔记之CSRF的防御
- csrf学习笔记
- Spring Security csrf学习
- yii2学习之CSRF验证
- spring security csrf 学习笔记
- Laravel框架学习(CSRF)
- yii2学习之CSRF验证
- 通过DVWA学习CSRF漏洞
- 【安全牛学习笔记】CSRF
- 【安全牛学习笔记】CSRF
- csrf
- CSRF
- csrf
- CSRF
- CSRF
- CSRF
- CSRF
- IOS monkey测试+命令行运行+日志收集
- 苹果开发者电话!
- 解决Xcode引用VLCKit之后Undefined symbols for architecture 问题
- java接口
- LeetCode 190: Reverse Bits
- CSRF引用学习
- 实现lucene来进行全文索引查找
- Spring1
- VPN 双机热备 灾难备份
- linux 批量ssh认证
- dataguard故障ERROR 1017 ORA-16191
- https证书 wamp2.5 配置单双向SSL证书
- 欢迎使用CSDN-markdown编辑器
- 有向图