CSRF跨站点请求伪造(Cross—SiteRequestForgery)。攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。
CSRF攻击原理以及过程
1、用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
CSRF攻击实例
受害者Bob在****有一笔存款,通过对****的网站发送请求bank.example/withdraw?account=bob&amount=1000000&for=bob2可以使Bob把1000000的存款转到bob2的账号下。通常情况下,该请求发送到网站后,服务器会先验证该请求是否来自一个合法的session,并且该session的用户Bob已经成功登陆。
黑客Mallory自己在该****也有账户,他知道上文中的URL可以把钱进行转帐操作。Mallory可以自己发送一个请求给****:bank.example/withdraw?account=bob&amount=1000000&for=Mallory。但是这个请求来自Mallory而非Bob,他不能通过安全认证,因此该请求不会起作用。
这时,Mallory想到使用CSRF的攻击方式,他先自己做一个网站,在网站中放入如下代码:src=”bank.example/withdraw?account=bob&amount=1000000&for=Mallory”,并且通过广告等诱使Bob来访问他的网站。当Bob访问该网站时,上述url就会从Bob的浏览器发向****,而这个请求会附带Bob浏览器中的cookie一起发向****服务器。大多数情况下,该请求会失败,因为他要求Bob的认证信息。但是,如果Bob当时恰巧刚访问他的****后不久,他的浏览器与****网站之间的session尚未过期,浏览器的cookie之中含有Bob的认证信息。这时,悲剧发生了,这个url请求就会得到响应,钱将从Bob的账号转移到Mallory的账号,而Bob当时毫不知情。等以后Bob发现账户钱少了,即使他去****查询日志,他也只能发现确实有一个来自于他本人的合法请求转移了资金,没有任何被攻击的痕迹。而Mallory则可以拿到钱后逍遥法外。
Django中如何防范CSRF
Django使用专门的中间件(CsrfMiddleware)来进行CSRF防护。具体的原理如下:
1.它修改当前处理的请求,向所有的POST表单增添一个隐藏的表单字段,使用名称是csrfmiddlewaretoken,值为当前会话ID加上一个密钥的散列值。如果未设置会话ID,该中间件将不会修改响应结果,因此对于未使用会话的请求来说性能损失是可以忽略的。
2.对于所有含会话cookie集合的传入POST请求,它将检查是否存在csrfmiddlewaretoken及其是否正确。如果不是的话,用户将会收到一个403HTTP错误。403错误页面的内容是检测到了跨域请求伪装。终止请求。
该步骤确保只有源自你的站点的表单才能将数据POST回来。
另外要说明的是,未使用会话cookie的POST请求无法受到保护,但它们也不需要受到保护,因为恶意网站可用任意方法来制造这种请求。为了避免转换非HTML请求,中间件在编辑响应结果之前对它的Content-Type头标进行检查。只有标记为text/html或application/xml+xhtml的页面才会被修改。
Django防范CSRF的具体操作
1.将'django.middleware.csrf.CsrfViewMiddleware'添加到Django的settings.py文件中的MIDDLEWARE_CLASSES列表中(默认已经添加)。该中间件必须在SessionMiddleware之后执行,因此在列表中CsrfMiddleware必须出现在SessionMiddleware之前(因为响应中间件是自后向前执行的)。同时,它也必须在响应被压缩或解压之前对响应结果进行处理,因此CsrfMiddleware必须在GZipMiddleware之后执行。
MIDDLEWARE_CLASSES=(
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
#Uncommentthenextlineforsimpleclickjackingprotection:
#'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
2.在使用到POST方法提交FORM的页面中,添加csrf_token标签,例如:
<formaction="."method="post">{%csrf_token%}
3.在相应的view中,确保“django.core.context_processors.csrf”上下文处理器被正确使用,有两种方法实现这一点,一是使用RequestContext,它内部会自动使用到“django.core.context_processors.csrf”。另一种方法是手动使用这个处理器,示例代码如下:
fromdjango.core.context_processorsimportcsrf
fromdjango.shortcutsimportrender_to_response
defmy_view(request):
c={}
c.update(csrf(request))
#...viewcodehere
returnrender_to_response("a_template.html",c)
以上就是关于扣丁学堂Python培训之Django中如何防范CSRF跨站点请求伪造攻击的详细介绍,希望对小伙伴们有所帮助,想要了解更多内容的小伙伴可以登录扣丁学堂官网查询。扣丁学堂是专业的Python培训机构,不仅有专业的老师和与时俱进的课程体系,还有大量的Python视频教程供学员观看学习哦。扣丁学堂python学习交流群:816572891。微信号:codingbb