CSRF(跨站域请求伪造)是一种网络的攻击方式,它在2007年曾被列为互联网20大安全隐患之一。其他安全隐患,比如SQL脚本注入,跨站域脚本攻击等在近年来已经逐渐为众人熟知,很多网站也都 针对他们进行了防御。
CSRF攻击原理
网站是通过cookie来实现登陆功能的。而cookie只要存在浏览器中,那么浏览器在访问这个cookie的服务器的时候,就会自动的携带cookie信息到服务器上去。那么这时候就存在一个漏洞了,如果你访问了一个别有用心或病毒网站,这个网站可以在网页源代码中插入js代码,使用js代码给其他服务器发送请求(比如ICBC的转账请求)。那么因为在发送请求的时候,浏览器会自动的把cookie发送给对应的服务器,这时候相应的服务器(比如ICBC网站),就不知道这个请求是伪造的,就被欺骗过去了。从而达到在用户不知情的情况下,给某个服务器发送了一个请求(比如转账)
防御CSRF攻击:
CSRF攻击的要点就是在向服务器发送请求的时候,相应的cookie会自动的发送给对应的服务器。造成服务器不知道这个请求是用户发起的还是伪造的。这时候,我们可以在用户每次访问有表单的页面的时候,在网页源代码中加一个随机的a字符串叫做csrf_token,在cookie中加一个也加入一个相同值的csrf_token字符串,以后给服务器发送请求的时候,必须在body中以及cookie中都携带csrf_token,服务器只有检测到cookie中的csrf_token和body中的csrf_token都相同,才认为这个请求是正常的,否则就是伪造的,那么黑客就没办法伪造请求了
AJAX的CSRF保护:
在AJAX中要使用csrf保护,则必须手动的添加X-CSRFToken到Header中。但是CSRF从哪里来,还是需要通过模板给渲染,而Flask比较推荐的方式是在meta标签中渲染csrf。如下
在Python里面写
from flask_wtf import CSRFProtect
在HTML代码里面写
<meta name=‘csrf-token‘ content= "{{csrf_token()}}">
如果要发送AJAX请求,则在发送之前要添加CSRF,代码如下(使用了jQuery)
var csrftoken = $(‘meta[name=csrf-token]‘).attr(‘content‘) $.ajaxSetup({ //在发送之前会执行这个函数 "beforeSend": function(xhr,settings){ if(!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type)&&!this.crossDomain){ xhr.setRequestHeader("X-CSRFToken",csrftoken) } } })
原文:https://www.cnblogs.com/fengzi759/p/12152530.html