热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(10)Django框架学习Templates进阶用法中

HTML代码自动转义(auto-escaping)当使用模板生成HTML代码时,如果变量内容是一些影响HTML结果的字符时,

HTML代码自动转义(auto-escaping)

当使用模板生成HTML代码时,如果变量内容是一些影响HTML结果的字符时,那就挺危险的。
例如,模板内容如下:
Hello {{ name }}
当name的值为:
渲染后的HTML结果就是:
Hello
以上的代码运行的结果就是会让浏览器弹出一个Javascript的警告窗口。
同理,如果name的值为hanks,那么结果中Hello以后的所有内容就会被字体加粗,因为
没有写结束标记。
这种攻击方式被称为跨站脚本攻击(Cross Site Scripting,CSS或者XSS),是一种站点应
用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在
观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。
以上定义来自Wiki:
http://zh.wikipedia.org/wiki/%E8%B7%A8%E7%B6%B2%E7%AB%99%E6%8C%87%E4%BB%A4%E7%A2%BC
很显然,任何时候都不要相信用户输入的数据,都要使用防御性编程,为了避免上面的问题,你有两个选择:
1. 使用模板中的filter功能,Django有提供一个escape filter,可以用来过滤掉所有你不信任的变量,不过
需要在每一个变量后使用,这样很容易会漏掉对某个变量使用escape.
2. 使用Django的模板自动转义功能。其实是默认开启的
Django默认转义每一个变量的内容,尤其是下面5个字符:
  • <被转义成 <
  • > 被转义成 >
  • &#39; 被转义成 &#39;
  • " 被转义成 "
  • & 被转义成 &
上面中的分号也是转义后的一部分。
例如网页内容&#xff1a;
页面源代码为&#xff1a;
可以看到&#xff0c;转义只对变量的内容进行使用&#xff0c;模板本身的HTML代码不会被转义。
如何关闭这个功能&#xff1f;
为什么呢&#xff0c;有可能你有时就是想让变量的内容渲染成原始的HTML代码&#xff0c;所以不想被转义。
比如你想让template系统产生文本内容而不是HTML&#xff0c;就像email信息一样。
Django提供了三种方式关闭自动转义&#xff1a;变量级别&#xff0c;模板级别和站点级别。
1. 变量级别
使用safe这个过滤器对每一个变量进行禁用自动转义
This will be escaped: {{ data }}
This will not be escaped: {{ data|safe }}
效果如下&#xff1a;
网页内容
页面源代码
上面之所以没有显示出来&#xff0c;是HTML语法错误&#xff0c;这就是不转义的下场。。。
2. 模板级别
在模板中使用autoescape标签来控制&#xff0c;可以嵌套使用
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 %}
同时&#xff0c;autoescape标签的影响具有继承性&#xff0c;可以从父模板影响到子模板。
# base.html
{% autoescape off %}

{% block title %}{% endblock %}

{% block content %}
{% endblock %}
{% endautoescape %}
# child.html
{% extends "base.html" %}
{% block title %}This & that{% endblock %}
{% block content %}{{ greeting }}{% endblock %}
继承之后的子模板&#xff0c;也都禁用了自动转义功能。如果greeting变量含有&#xff0c;
将不会被转义。
需要注意的是&#xff0c;模板的作者不用去担心自动转义的使用。更多的python端的
开发人员需要考虑哪些数据需要去转义&#xff0c;合理去使用这些数据。
如果你创建了一个模板&#xff0c;而且不太清楚所应用的环境是否开启了自动转义功能。那就在所有
的变量上加上escape过滤器&#xff0c;escape过滤器不会对已经escape的内容产生影响。
对于filter过滤器中参数的自动转义
Django中的自动转义功能不会对filter中的参数已作用&#xff0c;也就是说&#xff0c;最好在filter的参数中&#xff0c;自己
写成转义后的代码&#xff0c;比如这种情况你应该手写成
{{ data|default:"3 <2" }}
而不是
{{ data|default:"3 <2" }}
这是为了安全起见。



通过 为知笔记 发布



转:https://www.cnblogs.com/btchenguang/archive/2012/09/03/2669059.html



推荐阅读
  • 本课程详细介绍了如何使用Python Flask框架从零开始构建鱼书应用,涵盖高级编程技巧和实战项目。通过视频教学,学员将学习到Flask的高效用法,包括数据库事务处理和书籍交易模型的实现。特别感谢AI资源网提供的课程下载支持。 ... [详细]
  • PHP连接MySQL的三种方法及预处理语句防止SQL注入的技术详解
    PHP连接MySQL的三种方法及预处理语句防止SQL注入的技术详解 ... [详细]
  • 内网渗透技术详解:PTH、PTT与PTK在域控环境中的应用及猫盘内网穿透配置
    本文深入探讨了内网渗透技术,特别是PTH、PTT与PTK在域控环境中的应用,并详细介绍了猫盘内网穿透的配置方法。通过这些技术,安全研究人员可以更有效地进行内网渗透测试,解决常见的渗透测试难题。此外,文章还提供了实用的配置示例和操作步骤,帮助读者更好地理解和应用这些技术。 ... [详细]
  • jQuery Flot 数据可视化插件:高效绘制图表的专业工具
    jQuery Flot 是一款高效的数据可视化插件,专为绘制各种图表而设计。该工具支持丰富的图表类型和自定义选项,适用于多种应用场景。用户可以通过其官方网站获取示例代码和下载资源,以便快速上手和使用。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • 本文介绍了使用 Python 编程语言高效抓取微博文本和动态网页图像数据的方法。通过详细的示例代码,展示了如何利用爬虫技术获取微博内容和动态图片,为数据采集和分析提供了实用的技术支持。对于对网络数据抓取感兴趣的读者,本文具有较高的参考价值。 ... [详细]
  • Spring框架入门指南:专为新手打造的详细学习笔记
    Spring框架是Java Web开发中广泛应用的轻量级应用框架,以其卓越的功能和出色的性能赢得了广大开发者的青睐。本文为初学者提供了详尽的学习指南,涵盖基础概念、核心组件及实际应用案例,帮助新手快速掌握Spring框架的核心技术与实践技巧。 ... [详细]
  • Python学习:环境配置与安装指南
    Python作为一种跨平台的编程语言,适用于Windows、Linux和macOS等多种操作系统。为了确保本地已成功安装Python,用户可以通过终端或命令行界面输入`python`或`python3`命令进行验证。此外,建议使用虚拟环境管理工具如`venv`或`conda`,以便更好地隔离不同项目依赖,提高开发效率。 ... [详细]
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • SQLmap自动化注入工具命令详解(第28-29天 实战演练)
    SQL注入工具如SQLMap等在网络安全测试中广泛应用。SQLMap是一款开源的自动化SQL注入工具,支持12种不同的数据库,具体支持的数据库类型可在其插件目录中查看。作为当前最强大的注入工具之一,SQLMap在实际应用中具有极高的效率和准确性。 ... [详细]
  • 在Java应用程序中调用`response.getStatus()`方法时遇到了`NoSuchMethodError`异常,经过分析,初步判断为依赖冲突问题。通过检查项目依赖树发现,当前项目版本与某些库的版本不兼容,导致该方法无法被正确识别。建议通过更新相关依赖版本或使用依赖管理工具(如Maven或Gradle)来解决此问题,确保所有依赖项版本一致且兼容。 ... [详细]
  • AngularJS uirouter模块下的状态管理机制深入解析
    本文深入探讨了 AngularJS 中 ui-router 模块的状态管理机制。通过详细分析状态配置、状态转换和嵌套状态等核心概念,结合实际案例,帮助开发者更好地理解和应用这一强大工具,提升单页面应用的开发效率和用户体验。 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • 在Ubuntu系统中,由于预装了MySQL,因此无需额外安装。通过命令行登录MySQL时,可使用 `mysql -u root -p` 命令,并按提示输入密码。常见问题包括:1. 错误 1045 (28000):访问被拒绝,这通常是由于用户名或密码错误导致。为确保顺利连接,建议检查MySQL服务是否已启动,并确认用户名和密码的正确性。此外,还可以通过配置文件调整权限设置,以增强安全性。 ... [详细]
author-avatar
loring8
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有