新闻  |   论坛  |   博客  |   在线研讨会
Python视频教程之Django中如何防范CSRF跨站点请求伪造攻击
扣丁学堂2 | 2021-03-12 11:40:00    阅读:917   发布文章

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

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客