31. Django 2.1.7 模板 - CSRF 跨站请求伪造

网友投稿 664 2022-11-21

31. Django 2.1.7 模板 - CSRF 跨站请求伪造

31. Django 2.1.7 模板 - CSRF 跨站请求伪造

参考文献

​​Site Request Forgery,译为跨站请求伪造。CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。

CSRF示意图如下:

如果想防止CSRF,首先是重要的信息传递都采用POST方式而不是GET方式,接下来就说POST请求的攻击方式以及在Django中的避免。

示例

下面开启两个Django服务,来模拟一下攻击过程。

首先来构建第一个Django项目

1)打开​​assetinfo/views.py​​​文件,创建视图​​login​​​,​​login_check​​​, ​​post​​​和​​post_action​​。

def login(reqeust): return render(reqeust, 'assetinfo/login.html')def login_check(request): username = request.POST.get('username') #获取用户名 password = request.POST.get('password') #获取密码 # 校验 if username == 'smart' and password == '123': request.session['username'] = username #记住登录用户名 request.session['islogin'] = True #判断用户是否已登录 return redirect('/assetinfo/post/') else: return redirect('/assetinfo/login/')def post(request): return render(request, 'assetinfo/post.html')def post_action(request): if request.session['islogin']: username = request.session['username'] return HttpResponse('用户'+username+'发了一篇帖子') else: return HttpResponse('发帖失败')

2)打开​​assetinfo/urls.py​​​文件,配置​​url​​。

urlpatterns = [ # ex:/assetinfo/login path('login/', views.login), # ex:/assetinfo/login_check path('login_check/', views.login_check), # ex:/assetinfo/post path('post/', views.post), # ex:/assetinfo/post_action path('post_action/', views.post_action),]

3)在​​templates/assetinfo/​​​目录下创建​​login.html​​​和​​post.html​​。

login.html

用户登录

用户名:
密码:

post.html

发帖页面

标题:
内容:

4)启动运行服务器。

python3 manage.py runserver

5)在浏览器中输入如下网址,将这个标签称为网站A。

​​html> B网站模拟请求页面


内容:

7)在windows中浏览器查看效果如下图,将这个标签称为网站B。

8)Django项目中默认启用了csrf保护,现在先禁用,打开第一个项目中的mysite/settings.py文件,注释掉csrf中间件。

通过action直接访问网站A的地址,成功执行发帖。

对比上面两个步骤,发现无论从网站A还是网站B都可以访问网站A的post_action视图,这就是不安全的。

防止CSRF

1)Django提供了csrf中间件用于防止CSRF攻击,只需要在网站A的mysite/settings.py中启用csrf中间件即可。

要注意,Django 2 开始开启中间件不是默认生产的​​MIDDLEWARE_CLASSES​​​中编写,需要写到​​MIDDLEWARE​​中,如下:

MIDDLEWARE = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware',)

3)这下麻烦了,因为网站A自己也不能访问了,接下来templates/assetinfo/post.html内容,在form表单中使用标签csrf_token。

{% csrf_token %}

好了,Django中成功完成CSRF防护。

总结

重要信息如金额、积分等,采用POST方式传递启用CSRF中间件,默认启用在form表单中post提交时加入标签csrf_token

保护原理

加入标签后,可以查看post.html的源代码,发现多了一个隐藏域。

在浏览器的“开发者工具”中查看cookie信息。

说明:当启用中间件并加入标签csrf_token后,会向客户端浏览器中写入一条Cookie信息,这条信息的值与隐藏域input元素的value属性是一致的,提交到服务器后会先由csrf中间件进行验证,如果对比失败则返回403页面,而不会进行后续的处理。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:注解-FeignClient详情
下一篇:Git 常用命令集
相关文章

 发表评论

暂时没有评论,来抢沙发吧~