前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django 模板HTML转义和CSRF4.3

Django 模板HTML转义和CSRF4.3

作者头像
Lansonli
发布2021-10-09 10:48:15
1.2K0
发布2021-10-09 10:48:15
举报
文章被收录于专栏:Lansonli技术博客
  • Django对字符串进行自动HTML转义,如在模板中输出如下值:
代码语言:javascript
复制
视图代码:
def index(request):
    return render(request, 'temtest/index2.html',
                  {
                      't1': '<h1>hello</h1>'
                  })
模板代码:
{{t1}}
  • 显示效果如下图:

会被自动转义的字符

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

> 会转换为&gt;

' (单引号) 会转换为&#39;

" (双引号)会转换为 &quot;

& 会转换为 &amp;
  • 当显示不被信任的变量时使用escape过滤器,一般省略,因为Django自动转义
代码语言:javascript
复制
{{t1|escape}}

关闭转义

  • 对于变量使用safe过滤器
代码语言:javascript
复制
{{ data|safe }}
  • 对于代码块使用autoescape标签
代码语言:javascript
复制
{ % autoescape off %}
{{ body }}
{ % endautoescape %}
  • 标签autoescape接受on或者off参数
  • 自动转义标签在base模板中关闭,在child模板中也是关闭的

字符串字面值

  • 手动转义
代码语言:javascript
复制
{ { data|default:"<b>123</b>" }}
  • 应写为
代码语言:javascript
复制
{ { data|default:"&lt;b&gt;123&lt;/b&gt;" }}

csrf

  • 全称Cross Site Request Forgery,跨站请求伪造
  • 某些恶意网站上包含链接、表单按钮或者JavaScript,它们会利用登录过的用户在浏览器中的认证信息试图在你的网站上完成某些操作,这就是跨站攻击
  • 演示csrf如下
  • 创建视图csrf1用于展示表单,csrf2用于接收post请求
代码语言:javascript
复制
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
代码语言:javascript
复制
url(r'^csrf1/$', views.csrf1),
url(r'^csrf2/$', views.csrf2),
  • 创建模板csrf1.html用于展示表单
代码语言:javascript
复制
<html>
<head>
    <title>Title</title>
</head>
<body>
<form method="post" action="/crsf2/">
    <input name="uname"><br>
    <input type="submit" value="提交"/>
</form>
</body>
</html>
  • 创建模板csrf2用于展示接收的结果
代码语言:javascript
复制
<html>
<head>
    <title>Title</title>
</head>
<body>
{{ uname }}
</body>
</html>
  • 在浏览器中访问,查看效果,报错如下:
  • 将settings.py中的中间件代码'django.middleware.csrf.CsrfViewMiddleware'注释
  • 查看csrf1的源代码,复制,在自己的网站内建一个html文件,粘贴源码,访问查看效果

防csrf的使用

  • 在django的模板中,提供了防止跨站攻击的方法,使用步骤如下:
  • step1:在settings.py中启用'django.middleware.csrf.CsrfViewMiddleware'中间件,此项在创建项目时,默认被启用
  • step2:在csrf1.html中添加标签
代码语言:javascript
复制
<form>
{% csrf_token %}
...
</form>
  • step3:测试刚才的两个请求,发现跨站的请求被拒绝了,效果如下图

取消保护

  • 如果某些视图不需要保护,可以使用装饰器csrf_exempt,模板中也不需要写标签,修改csrf2的视图如下
代码语言:javascript
复制
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})
  • 运行上面的两个请求,发现都可以请求

保护原理

  • 加入标签后,可以查看源代码,发现多了如下代码
代码语言:javascript
复制
<input type='hidden' name='csrfmiddlewaretoken' value='nGjAB3Md9ZSb4NmG1sXDolPmh3bR2g59' />
  • 在浏览器的调试工具中,通过network标签可以查看cookie信息
  • 本站中自动添加了cookie信息,如下图
  • 查看跨站的信息,并没有cookie信息,即使加入上面的隐藏域代码,发现又可以访问了
  • 结论:django的csrf不是完全的安全
  • 当提交请求时,中间件'django.middleware.csrf.CsrfViewMiddleware'会对提交的cookie及隐藏域的内容进行验证,如果失败则返回403错误
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/10/06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • csrf
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档