Django 模板HTML转义和CSRF4.3

简介: Django 模板HTML转义和CSRF4.3
  • Django对字符串进行自动HTML转义,如在模板中输出如下值:


视图代码:
def index(request):
    return render(request, 'temtest/index2.html',
                  {
                      't1': '<h1>hello</h1>'
                  })
模板代码:
{{t1}}


显示效果如下图:


image.png


会被自动转义的字符


  • html转义,就是将包含的html标签输出,而不被解释执行,原因是当显示用户提交字符串时,可能包含一些攻击性的代码,如js脚本
  • Django会将如下字符自动转义:


< 会转换为&lt;
> 会转换为&gt;
' (单引号) 会转换为&#39;
" (双引号)会转换为 &quot;
& 会转换为 &amp;


当显示不被信任的变量时使用escape过滤器,一般省略,因为Django自动转义


{{t1|escape}}


关闭转义


  • 对于变量使用safe过滤器


{{ data|safe }}


对于代码块使用autoescape标签


{ % autoescape off %}
{{ body }}
{ % endautoescape %}


  • 标签autoescape接受on或者off参数


  • 自动转义标签在base模板中关闭,在child模板中也是关闭的


字符串字面值


  • 手动转义


{ { data|default:"<b>123</b>" }}


应写为


{ { data|default:"&lt;b&gt;123&lt;/b&gt;" }}


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>


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


20191006175607778.png


  • 将settings.py中的中间件代码'django.middleware.csrf.CsrfViewMiddleware'注释
  • 查看csrf1的源代码,复制,在自己的网站内建一个html文件,粘贴源码,访问查看效果


防csrf的使用


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


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


  • step2:在csrf1.html中添加标签


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


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


image.png


取消保护


  • 如果某些视图不需要保护,可以使用装饰器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})


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


保护原理


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


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


  • 在浏览器的调试工具中,通过network标签可以查看cookie信息
  • 本站中自动添加了cookie信息,如下图


image.png


  • 查看跨站的信息,并没有cookie信息,即使加入上面的隐藏域代码,发现又可以访问了
  • 结论:django的csrf不是完全的安全
  • 当提交请求时,中间件'django.middleware.csrf.CsrfViewMiddleware'会对提交的cookie及隐藏域的内容进行验证,如果失败则返回403错误


目录
相关文章
|
24天前
|
定位技术
时尚的联系我们表单HTML模板(源码)
一款时尚的联系我们表单Html模板,带地图和所在位置,输入基本信息和信息发送,看起来很漂亮的联系我们页面。
36 1
时尚的联系我们表单HTML模板(源码)
|
3月前
|
缓存 Java 应用服务中间件
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
这篇文章详细介绍了在SpringMVC中创建JSP页面的全过程,包括项目的创建、配置、Tomcat的设置,以及如何实现页面跳转和配置模板解析器,最后还对比了JSP和HTML模板解析的差异。
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
|
2月前
|
Java C++ Python
django 模板 过滤器
django 模板 过滤器
|
3月前
|
前端开发 JavaScript 数据库
python Django教程 之模板渲染、循环、条件判断、常用的标签、过滤器
python Django教程 之模板渲染、循环、条件判断、常用的标签、过滤器
|
3月前
|
JSON 数据处理 API
Django后端架构开发:视图与模板的正确使用
Django后端架构开发:视图与模板的正确使用
37 1
|
3月前
|
前端开发 Python
Django模板
【8月更文挑战第19天】
32 3
|
3月前
|
自然语言处理 前端开发 数据处理
Django的模板系统
【8月更文挑战第13天】
30 2
|
3月前
|
API Java 数据库连接
从平凡到卓越:Hibernate Criteria API 让你的数据库查询瞬间高大上,彻底告别复杂SQL!
【8月更文挑战第31天】构建复杂查询是数据库应用开发中的常见需求。Hibernate 的 Criteria API 以其强大和灵活的特点,允许开发者以面向对象的方式构建查询逻辑,同时具备 SQL 的表达力。本文将介绍 Criteria API 的基本用法并通过示例展示其实际应用。此 API 通过 API 构建查询条件而非直接编写查询语句,提高了代码的可读性和安全性。无论是简单的条件过滤还是复杂的分页和连接查询,Criteria API 均能胜任,有助于提升开发效率和应用的健壮性。
131 0
|
3月前
|
前端开发 数据处理 开发者
解锁Django模板系统终极奥义!揭秘高效前端渲染秘籍,让你的网站秒变炫酷黑科技!
【8月更文挑战第31天】Django作为Python的高级Web框架,内置的模板系统支持动态HTML渲染。本文通过在线书店案例,详细介绍Django模板系统的设置与高效渲染技巧,包括创建模板文件、编写视图函数及URL配置。通过合理使用过滤器、深度查询和模板继承等技巧,提升前端渲染效率和安全性,优化Web应用开发流程。
26 0
|
3月前
|
JSON 前端开发 数据安全/隐私保护
Django入门到放弃之CSRF_TOKEN
Django入门到放弃之CSRF_TOKEN
下一篇
无影云桌面