csrf
csrf(cross-site request forgetery)即跨站请求伪造,最关键的一点原因:其他页面可以获取该浏览器上的所有cookie信息,然后它可以用cookie伪造真正的作者发起攻击
CSRF 攻击原理
1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,
所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
token防御的整体思路是:
-
第一步:后端随机产生一个token,把这个token保存在SESSION状态中;同时,后端把这个token交给前端页面;
-
第二步:下次前端需要发起请求(比如发帖)的时候把这个token加入到请求数据或者头信息中,一起传给后端;
-
第三步:后端校验前端请求带过来的token和SESSION里的token是否一致;
一定要注意get不用设立CSRF,但是post请求需要
{%csrf_token%}的实质:是一个隐藏的input类型的标签 name="csrfmiddlewaretoken" value是浏览器给的字符串

submit的实质: 帮我们把input中的name和value拼成了字典
print(request.POST)
结果:
<QueryDict: {'csrfmiddlewaretoken': ['qfMnLpZ4kHUH0jD9vU4YRr24Uh7qsfFy4141X94tA1lVaeVPSpaPcMNu6pVE159a'],
'user': ['为'], 'pwd': ['1212121']}>
http://www.thinkphp.cn/topic/54494.html
在django中
django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。
csrf要求发送post,put或delete请求的时候,是先以get方式发送请求,服务端响应时会分配一个随机字符串给客户端,
客户端第二次发送post,put或delete请求时携带上次分配的随机字符串到服务端进行校验
全局:
中间件 django.middleware.csrf.CsrfViewMiddleware
在中间件中的process_viewf方法中验证csrf,首先检查该函数是否设置了@csrf_exempt如果设置了,就免除验证,否则在这里进行csrf_token的验证
局部:
- @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
- @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
注:from django.views.decorators.csrf import csrf_exempt,csrf_protect
应用
1.在post的表单中加入
{% csrf_token %}
2.使用ajax技术时:
用POST请求的情况下
模板页面中必须要有 {% csrf_token %}
<script>
$("#i3").on("click",function () {
$.ajax({
url:"/login_bbs/",
type:"post",
data:{"username":$("#i1").val(),"password":$("#i2").val(),"csrfmiddlewaretoken":$("[name='csrfmiddlewaretoken']").val()},
success:function (data) {
var data1=JSON.parse(data);
if(data1.true_info==="正确"){
location.href="/index/"
}else{
$("#btns").html("用户名或密码错误").css("color","red")
}
}
})
})
</script>
解决方法:
不用cookie,因为cookie会被其他页面获取到,使用token,把token放在请求头中,每次请求都验证
注意:
CSRF的Token仅仅用于对抗CSRF攻击。当网站同时存在XSS漏洞时候,那这个方案也是空谈。
前后端分离的项目一般不用CSRF这个中间件,需要注释掉这个中间件
1. 在前后端分离的应用中,前端通常运行在一个不同的域或子域中,而CSRF保护基于同源策略,要求请求来源与目标站点相同。因此,如果你的API会被跨域请求调用,启用CSRF保护可能导致请求被拒绝。 Token-Based认证: 2. 在前后端分离的应用中,通常会使用基于Token的认证机制,而不是Django默认的基于Session的认证。在这种情况下,由于请求不携带Django生成的CSRF token,启用CSRF保护可能导致请求失败。 公共API: 3. 如果你的API是公共可用的,并且可能被其他网站或应用调用,启用CSRF保护可能会对合法的请求造成问题。在这种情况下,可能需要在特定的API视图中免除CSRF保护。
xss攻击
XSS是什么?它的全名是:Cross-site scripting,为了和CSS层叠样式表区分所以取名XSS。是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。
恶意攻击者往Web页面里插入恶意script代码,当用户浏览该页之时,嵌入其中Web里面的script代码会被执行,从而达到恶意攻击用户的目的。
防御措施:
- 当恶意代码值被作为某一标签的内容显示:在不需要html输入的地方对html 标签及一些特殊字符( ” < > & 等等 )做过滤,将其转化为不被浏览器解释执行的字符。django默认就是过滤HTML标签,
如何我们真的需要有个script显示到前端就用mark_safe

浙公网安备 33010602011771号