在视图中始终转义输出?为什么?

3
Zend Framework手册中有以下内容:

60.3.1. 转义输出

在视图脚本中执行的最重要任务之一是确保输出被正确地转义;其中,这可以帮助避免跨站点脚本攻击。除非您正在使用一个能够自行转义的函数、方法或辅助工具,否则在输出变量时,您应该始终进行转义。

为什么要“始终”转义? 为什么必须转义那些没有被用户输入创建或更改的变量?
7个回答

9

用户不是输出中可疑字符串的唯一来源。例如,从数据库中输出的看似安全的字符串"Romeo & Juliet"。你说这里没有跨站脚本漏洞?当然没错。但是如果把它放在网页中,原始的&符号可能会导致验证、解析等方面出现一些有趣的问题。

输出转义不仅仅是为了防范恶意或意外损坏的输入,而且确保输出经过彻底的净化,并被视为在周围的输出格式中没有特殊含义,无论是HTML、XML、JSON还是其他格式。


有没有办法通过KO2和KO3自动完成这个操作? - Andres

4
作为一项原则,我会避免处理来自用户输入、数据源甚至计算的任何内容。您希望输出结果是可预测的,转义可以确保这一点。如果值在转换为字符串时包含破坏所需标记的字符,情况会变得混乱。
如果您正在使用视图,则$this->escape($variableToEscape)应该足够。

2

另外一件事是,有很多时候,一些被硬编码的内容,在另一天可能会变成用户或至少是数据库生成的内容。更好的做法是在代码中管理变量的输出。


1
你可以这样看待它:除非你知道变量已经被编码,否则你应该始终对变量进行HTML编码。
比如说,假设你有一个包含以下内容的变量:
foo <b>bar</b>

如果您知道它包含HTML标记,并且您对此感到满意,那么您可以说该变量已经正确地进行了HTML编码。您甚至可以将其分配给不同的变量类型,以使编译器注意区别(Joel的想法),并且使您的输出函数处理这些类型而无需转义它们。
当然,这意味着
foo & <b>bar</b>

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

foo &amp; <b>bar</b>

1
我认为这里的最佳实践是始终转义输出,除非您打算输出一个原始的 HTML 片段。即使是“安全”的数据也可能包含需要转义的字符。例如,请考虑电子邮件地址'"Bob" <bob@bob.com>'。如果您不进行转义,浏览器将认为<bob@bob.com>是一种标记。

1

显然,您希望转义用户数据的结果以防止XSS攻击。由于您经常更改重新发布和不重新发布的内容,您可能无法记住需要更改的所有位置...因此,即使您现在正确理解了所有细微差别,并且您的网站今天免受XSS脚本的攻击,但您可能会在某个时候将用户输入添加到某些未转义的变量中(或更有可能是一些变量到一些变量到一些变量,您没有进行转义),这将使您面临XSS攻击。

默认情况下进行转义可以防止该攻击。

另一个原因更为概念化:使用MVC,您的所有标记(定义为“视图”)都应在视图模板中。因此,如果您的控制器确定了视图,并且视图包含所有标记,为什么不转义您的变量呢?


0

如果你有硬编码的数值(比如说语言翻译,从数据库或XML文件读取),你不需要转义它们。

但是如果一个数值是由用户创建/修改的,即使在管理面板中,你必须要转义它,因为你不知道用户发送的数据类型是什么,甚至更极端一点,就算是管理员也不例外。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接