22 Django模板 - csrf

简介: 22 Django模板 - csrf

1.CSRF

  • 全称Cross Site Request Forgery,跨站请求伪造
  • 某些恶意网站上包含链接、表单按钮或者JavaScript,它们
  • 利用登录过的用户在浏览器中的认证信息试图在你的网站上完成某些操作,这就是跨站攻击

演示csrf如下:

创建视图csrf1用于展示表单,csrf2用于接收post请求

def csrf1(request):
    return render(request,'booktest/csrf1.html')
def csrf2(request):
    uname=request.POST['uname']
    return render(request,'booktest/csrf2.html',{'uname':uname})

配置url:

url(r'^csrf1/$', views.csrf1),
url(r'^csrf2/$', views.csrf2),

创建模板csrf1.html用于展示表单

<html>
<head>
    <title>Title</title>
</head>
<body>
<form method="post" action="/crsf2/">
    <input name="uname"><br>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

创建模板csrf2用于展示接收的结果

<html>
<head>
    <title>Title</title>
</head>
<body>
{{ uname }}
</body>
</html>

在浏览器中访问,查看效果,报错如下:

settings.py中的中间件代

'django.middleware.csrf.CsrfViewMiddleware'注释

查看csrf1的源代码,复制,在自己的网站内建一个html文件,粘贴源码,访问查看效果。

2.防csrf的使用

在django的模板中,提供了防止跨站攻击的方法,使用步骤如下:

step1: 在settings.py中启用’django.middleware.csrf.CsrfViewMiddleware’中间件,此项在创建项目时,默认被启用。

step2: 在csrf1.html中添加标签

<form>
{% csrf_token %}
...
</form>

step3: 测试刚才的两个请求,发现跨站的请求被拒绝了,效果如下图

3.取消保护

如果某些视图不需要保护,可以使用装饰器csrf_exempt,模板中也不需要写标签,修改csrf2的视图如下:

from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def csrf2(request):
    uname=request.POST['uname']
    return render(request,'booktest/csrf2.html',{'uname':uname})

运行上面的两个请求,发现都可以请求。

4.保护原理

加入标签后,可以查看源代码,发现多了如下代码

<input type='hidden' name='csrfmiddlewaretoken' value='nGjAB3Md9ZSb4NmG1sXDolPmh3bR2g59' />

在浏览器的调试工具中,通过network标签可以查看cookie信息

本站中自动添加了cookie信息,如下图:

查看跨站的信息,并没有cookie信息,即使加入上面的隐藏域代码,发现又可以访问了.

结论:django的csrf不是完全的安全

当提交请求时,中间件’django.middleware.csrf.CsrfViewMiddleware’会对提交的cookie及隐藏域的内容进行验证,如果失败则返回403错误

目录
相关文章
|
3月前
|
SQL 前端开发 JavaScript
Python 教程之 Django(10)模板
Python 教程之 Django(10)模板
34 0
|
5月前
|
索引 Python
19 Django模板 - 定义模板
19 Django模板 - 定义模板
16 0
|
5月前
|
Python
18 Django模板 - 介绍
18 Django模板 - 介绍
25 0
|
7月前
|
Python
Django模板加载与响应2
Django模板加载与响应2
39 0
|
1天前
|
开发者 Python
Django模板系统的强大之处:动态渲染与扩展性
【4月更文挑战第15天】Django模板系统是Web开发中的强大工具,支持动态渲染和扩展性。动态渲染包括变量、标签和过滤器的使用,实现内容根据上下文数据动态生成。模板继承和自定义标签则提升了扩展性,减少代码重复,增强可维护性。通过这些特性,Django模板系统助力开发者构建高效、动态的Web应用。
|
1天前
|
存储 中间件 数据安全/隐私保护
Django的CSRF保护机制:保障用户数据安全
【4月更文挑战第15天】Django是一款具有内置CSRF保护的Python Web框架,通过CSRF中间件防止攻击者伪造用户请求。其机制包括:生成并自动添加到表单的CSRF令牌,服务器端的令牌验证以及每个用户会话的唯一令牌存储。为了增强防护,开发者应使用HTTPS,自定义令牌名称,限制跨域请求,并谨慎处理第三方库。Django的CSRF保护与最佳实践结合,能有效保障用户数据安全。
|
3月前
|
前端开发 JavaScript Python
Django 模板中使用 Ajax POST
Django 模板中使用 Ajax POST
16 0
|
4月前
|
前端开发 JavaScript 数据库
Python 教程之 Django(10)模板
Python 教程之 Django(10)模板
37 0
|
5月前
|
Ubuntu Python
23 Django模板 - 验证码案例
23 Django模板 - 验证码案例
31 0
|
5月前
|
JavaScript Python
21 Django模板 - HTML转义
21 Django模板 - HTML转义
24 0