一、自动HTML转义

  从模板生成HTML时,总会有变量包含影响最终HTML的字符风险,例如,考虑这个模板的片段:

Hello, {{ name }}

起初,这是一种显示用户名的无害方式,但考虑用户输入他们的名字时,输入:

<script>alert('')</script>

使用该名称值的时候,模板在显示的时候:

Hello, <script>alert('hello')</script>

这意味着浏览器会弹出一个JavaScript警告框!

显然,用户提交的数据不应该盲目地被信任,并且直接插入到您的网页中,因为恶意用户可能会使用这种漏洞来做可能不好的事情。这种类型的安全漏洞被称为 跨站点脚本(XSS)攻击。

为了避免这个问题,你有两个选择:

  • 一,你可以确保通过escape过滤器运行每个不受信任的变量 (如下文档所述),将可能有害的HTML字符转换为无害的字符。这是在Django的最初几年默认的解决方案,但问题是,它把责任推给,开发者/模板作者,以确保您逃避一切。忘记逃离数据很容易。
  • 二,你可以利用Django的自动HTML转义。

默认情况下,在Django中,每个模板都会自动转义每个变量标签的输出。具体来说,这五个字符是逃脱的:

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

我们再次强调,这种行为默认是开启的。如果您使用的是Django的模板系统,那么您将受到保护。

二、如何关闭它

如果您不希望数据被自动转义,请在每个站点,每个模板级别或每个变量级别上进行自动转义,您可以通过多种方式将其关闭。

你为什么要关闭它?因为有时候,模板变量会包含您打算以原始HTML呈现的数据,在这种情况下,您不希望其内容被转义。例如,您可能会在您的数据库中存储一块HTML,并希望将其直接嵌入到您的模板中。或者,您可能正在使用Django的模板系统来生成不是 HTML的文本- 比如电子邮件。

对于个体变量

要禁用单个变量的自动转义,请使用safe 过滤器:

This will be escaped: {{ data }}
This will not be escaped: {{ data|safe }}

认为安全避免进一步转义的安全手段,或者可以安全地解释为HTML。在这个例子中,如果data包含'<b>',输出将是:

This will be escaped: &lt;b&gt;
This will not be escaped: <b>

对于模板块

要控制模板的自动转义,请将模板(或模板的特定部分)包装到autoescape标记中,如下所示:

{% autoescape off %}
Hello {{ name }}
{% endautoescape %}

autoescape标签采用两种onoff作为其参数。有时,您可能需要强制自动转义,否则会被禁用。这是一个示例模板:

Auto-escaping is on by default. Hello {{ name }}

{% autoescape off %}
This will not be auto-escaped: {{ data }}. Nor this: {{ other_data }}
{% autoescape on %}
Auto-escaping applies again: {{ name }}
{% endautoescape %}
{% endautoescape %}

自动转义标签将其效果传递到扩展当前include标签的模板以及通过标签包含的模板,就像所有块标签一样。

由于在基本模板中关闭了自动转义,因此它也将在子模板中关闭,导致在greeting变量包含字符串时呈现以下呈现的HTML <b>Hello!</b>

<h1>This &amp; that</h1>
<b>Hello!</b>

Django-自动HTML转义的更多相关文章

  1. 是否采用Sybase形式的自动字符串转义(用 '' 表示 ')

    ;; 关于php.ini ;; ; 这个文件必须命名为'php.ini'并放置在httpd.conf中PHPINIDir指令指定的目录中. ; 最新版本的php.ini可以在下面两个位置查看: ; h ...

  2. django中的转义

    什么是html转义? 所谓html转义就是将  html关键字(包括标签,特殊字符等)  进行过滤替换.过滤替换格式如下: 接下来我们通过实例演示django中转义的细节以及如何关闭转义 一  dja ...

  3. django模板语言转义处理

    模板变量的内容,如果含html的话,django的模板系统默认会对输出进行转义,比如把<p>转义成了<p> ,然后再显示出来的时候就如实地显示为<p>.要解决这个问 ...

  4. Django如何使文件在django自动执行

    1. Django admin源码中 admin.py from django.contrib import admin # Register your models here. 在admin源码中 ...

  5. 用Django自动生成表遇到问题

    因为以前在数据库中已经生成过Django 叫App01下的表,所以无法生成,在数据库中执行这个命令 DELETE FROM django_migrations WHERE app='App01';然后 ...

  6. Django关闭html转义

    我们在views定义的html语句传递到html文件会按照原样式输出,并把我们定义的html标签页输出了,这是因为django模板默认帮我们开起了html转义功能 {{ lp}} <hr> ...

  7. Django自动获取项目中的全部URL

    import re from collections import OrderedDict from django.conf import settings from django.utils.mod ...

  8. 关于webpy模板自动HTML转义的问题

    注意: web.py 将会转义任何任何用到的变量,所以当你将 name 的值设为是一段 HTML 时,它会被转义显示成纯文本.如果要关闭该选项,可以写成 $:name 来代替 $name. 如果我们想 ...

  9. django自动生成接口文档

    我们在实际项目中,会需要将我们的一些接口的信息返回给前端,便于前后端的交互,在实际使用中,这种自动生成接口文档的模块很多,我主要是用REST framework自动生成接口文档,这个需要用到的是cor ...

  10. eclipse 粘贴字符串自动添加转义符

    eclipse -> Window -> Preferences -> Java -> Editor -> Typing -> 勾选{Escape text whe ...

随机推荐

  1. Android Studio 创建/打开项目时一直处于Building“project name”Gradle project info 的解决

    最近发现新版的AS,IDEA毛病不断,而且gradle的更新又给墙了,无奈啊! 进入类似如下的目录,发现如果没有对应的gradle解压文件,则在gradle官网下载完整压缩包,放入类似55xxxx串号 ...

  2. 解题:CQOI 2015 选数

    题面 神仙题,不需要反演 首先上下界同时除以$k$,转换成取$n$个$gcd$为$1$的数的方案数,其中上界向下取整,下界向上取整 然后设$f[i]$表示选$n$个互不相同的数$gcd$为$i$的方案 ...

  3. 解题:CF949D Curfew

    题面 整体的思路就是在均摊每个宿舍的人数,注意一个人可以跑好几次=.= 可以发现多的学生往中间跑一定能跑过宿管,所以只考虑学生们能不能及时跑到人不够的宿舍.对两边记录两个已经满足要求的宿舍,然后用前/ ...

  4. 2017 3 8 练习赛 t3 路径规划

    题目大意是让你在一棵树上找到一条路径使得(路径边权和*路径最小值) 最大. 这道题有两种方法. 1.点分治,考虑过重心的每条路径是否可能成为答案,枚举从根出发的每一条路径中的最小值等于总路径的最小值, ...

  5. bzoj2755【SCOI2012】喵星人的入侵

    输入格式 第一行为三个整数n,m,K,分别表示地图的长和宽,以及最多能放置的炮塔数量. 接下来的n行,每行包含m个字符,‘#’表示地图上原有的障碍,‘.’表示该处为空地,数据保证在原地图上存在S到T的 ...

  6. [case]filesystem problem

    e2fsck -Nov-) fsck.ext4: Superblock invalid, trying backup blocks... fsck.ext4: Bad magic number in ...

  7. ppp协议介绍(转)

    原文:https://www.cnblogs.com/gtarcoder/p/6259105.html PPP协议PPP协议是二层(数据链路层)协议,常用于拨号上网时客户端向服务器获取IP地址.PPP ...

  8. 共享内存shm*(生产者和消费者)

    //heads.h #ifndef HEAD_H #define HEAD_H #include <iostream> #include <sys/shm.h> //share ...

  9. Nginx反向代理websocket配置实例

    最近有一个需求,就是需要使用 nginx 反向代理 websocket,经过查找一番资料,目前已经测试通过,本文只做一个记录 复制代码 代码如下: 注: 看官方文档说 Nginx 在 1.3 以后的版 ...

  10. Mongo副本集搭建

    解压mongodb-linux-x86_64-rhel70-3.2.0.tgz 将解压后的bin路径添加到系统环境变量,保证mongo.mongod等命令可用 创建副本集目录mongo/27017.2 ...