代码之家  ›  专栏  ›  技术社区  ›  markus

总是在视图中转义输出?为什么?

  •  3
  • markus  · 技术社区  · 15 年前

    这个 Zend Framework Manual 如下所示:

    60.3.1.转义输出

    最重要的任务之一 在视图中执行脚本是为了 确保正确转义输出; 除此之外,这有助于 避免跨站点脚本攻击。 除非使用函数, 方法或执行转义的帮助程序 你应该自己逃跑 输出变量时。

    为什么总是这样? 为什么我必须转义未被用户输入创建或更改的变量?

    7 回复  |  直到 15 年前
        1
  •  9
  •   Rob    15 年前

    用户不是输出中不可靠字符串的唯一来源。例如,考虑一下从数据库中出现的“罗密欧与朱丽叶”这一明显安全的字符串。你说那里没有跨站点脚本?真的。但是,将它粘贴到网页中,原始的和号可能会导致验证、解析等一些有趣的问题。

    输出转义不仅仅是为了防止恶意或意外借用输入,它还确保输出被彻底消毒,并在周围的输出格式中被视为没有特殊意义,无论是HTML、XML、JSON或其他什么格式。

        2
  •  4
  •   skb    15 年前

    通常,我会从用户输入、数据源甚至是计算中逃离任何东西。您希望输出是可预测的,转义确保它是可预测的。如果转换为字符串时的值包含破坏所需标记的字符,则情况会变得混乱。

    如果你使用的是视图, $this->escape($variableToEscape) 应该足够了。

        3
  •  2
  •   Justin    15 年前

    另一件事是,很多时候,某一天硬编码的东西会变成用户,或者至少数据库会在另一天生成。管理代码中变量的输出是更好的做法。

        4
  •  1
  •   JW.    15 年前

    您可以这样看:您应该始终对变量进行HTML编码,除非您知道它们已经被编码了。

    假设有一个变量包含:

    foo <b>bar</b>
    

    如果您知道它包含HTML标记,并且您可以接受,那么您可以说这个变量已经被正确的HTML编码了。甚至可以将它赋给不同的变量类型,以使编译器知道区别(Joel的想法),并让输出函数处理这些类型而不转义它们。

    当然,这意味着

    foo & <b>bar</b>
    

    是不正确的值;您需要确保它是:

    foo &amp; <b>bar</b>
    
        5
  •  1
  •   Adam Crume    15 年前

    我认为这里的最佳实践总是转义输出,除非您打算输出一个原始的HTML片段。即使“安全”数据也可以包含需要转义的字符。例如,考虑电子邮件地址“bob”<bob@bob.com>。如果您不逃避,浏览器会认为<bob@bob.com>是一个标签。

        6
  •  1
  •   James Cape    15 年前

    显然,您希望避免用户数据的结果,以防止XSS攻击。因为你经常改变你要重新发布的内容和你不需要的内容,你可能记不起所有需要改变的地方…因此,即使您现在纠正了所有的细微差别,并且您的站点现在已经从XSS脚本中得到了保护,您也可能在某个时刻将用户输入添加到您没有转义的某个变量(或者更可能的是,将某个变量添加到某个变量,将某个变量添加到您没有转义的某个变量),这将使您面临XSS攻击。

    默认情况下逃逸可以防止这种攻击。

    另一个原因是更具概念性的:对于MVC,所有标记——根据定义,“视图”——都应该在视图模板中。因此,如果控制器正在确定视图,并且视图包含所有标记,为什么不转义变量呢?

        7
  •  0
  •   usoban    15 年前

    好吧,如果你有硬编码的值(比如从数据库或XML文件中读取的语言翻译),你就不必逃避它们。

    但是,如果有一个值是由用户创建/修改的,甚至可以说是在管理面板中,您必须避开它,因为您不知道什么类型的数据用户,或者如果我更激进,甚至是管理员,将会发送。