• Django-自动HTML转义


    一、自动HTML转义

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

    Hello, {{ name }}

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

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

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

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

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

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

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

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

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

    • < 转换为 &lt;
    • > 转换为 &gt;
    • ' (单引号)转换为 &#39;
    • " (双引号)转换为 &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>
  • 相关阅读:
    Spring AOP概念理解
    五分钟快速掌握RPC原理及实现
    Linux常用命令汇总
    一致性哈希算法原理
    RPC原理及实现
    IO设计模式:Reactor和Proactor对比
    到底什么时候该使用MQ?
    eclipse查看一个方法被谁引用(调用)的快捷键四种方式
    maven build pulgin
    VSCode 常用setiings.json设置
  • 原文地址:https://www.cnblogs.com/weihengblog/p/9010601.html
Copyright © 2020-2023  润新知