Security 是否总是在视图中转义输出?为什么?
报告说: 60.3.1。转义输出 最重要的任务之一 在视图中执行脚本是为了 确保输出正确转义; 除其他外,这有助于 避免跨站点脚本攻击。 除非您使用的是函数, 方法,或执行转义的帮助器 就其本身而言,你应该总是逃避 当您输出变量时Security 是否总是在视图中转义输出?为什么?,security,zend-framework,view,escaping,Security,Zend Framework,View,Escaping,报告说: 60.3.1。转义输出 最重要的任务之一 在视图中执行脚本是为了 确保输出正确转义; 除其他外,这有助于 避免跨站点脚本攻击。 除非您使用的是函数, 方法,或执行转义的帮助器 就其本身而言,你应该总是逃避 当您输出变量时 为什么“总是”?为什么我必须转义那些没有被用户输入创建或更改的变量?好吧,如果你有硬编码的值(比如从数据库或XML文件读取的语言翻译),你就不必转义它们 但是,如果有一个值是由用户创建/修改的,即使是在管理面板中,你也必须避开它,因为你不知道用户或我是否更激进,甚至管
为什么“总是”?为什么我必须转义那些没有被用户输入创建或更改的变量?好吧,如果你有硬编码的值(比如从数据库或XML文件读取的语言翻译),你就不必转义它们
但是,如果有一个值是由用户创建/修改的,即使是在管理面板中,你也必须避开它,因为你不知道用户或我是否更激进,甚至管理员会发送什么样的数据。另一件事是,很多时候,某一天硬编码的东西会变成用户,或者至少是另一天生成的数据库。管理代码中变量的输出是更好的做法。作为一项规则,我会避开来自用户输入、数据源甚至计算的任何内容。您希望输出是可预测的,转义可以确保输出是可预测的。如果转换为字符串时的值包含打断所需标记的字符,则事情会变得一团糟
如果您使用的是视图,
$this->escape($variableToEscape)
就足够了。用户并不是输出中不可靠字符串的唯一来源。例如,考虑从数据库中出来的显然安全的字符串“RoMeo &朱丽叶”。你说没有跨站点脚本?没错。但是,将其粘贴到网页中,原始的符号可能会在验证、解析等方面引起一些有趣的问题
输出转义不仅仅是为了防止恶意或意外损坏的输入,它还确保输出被彻底清理,并被视为在周围的输出格式中没有特殊意义,无论是HTML、XML、JSON还是其他格式。您可以这样看:您应该始终使用HTML编码变量,除非你知道它们已经被编码了 假设您有一个包含以下内容的变量:
foo <b>bar</b>
foo-bar
如果您知道它包含HTML标记,并且您对此没有意见,那么您可以说这个变量已经正确地进行了HTML编码。您甚至可以将其分配给不同的变量类型,以使编译器了解其区别(Joel的想法),并让输出函数在不转义的情况下处理这些类型
当然,这意味着
foo & <b>bar</b>
foo&bar
是一个不正确的值;您需要确保:
foo & <b>bar</b>
foo&;酒吧
我认为这里的最佳实践始终是转义输出,除非您打算输出原始HTML片段。即使是“安全”数据也可能包含需要转义的字符。例如,考虑电子邮件地址“鲍伯”。如果您不转义它,浏览器会认为它是一个标记。显然,您希望转义用户数据导致的内容,以防止XSS攻击。由于您经常更改正在重新发布的内容和未重新发布的内容,您可能记不起所有需要更改的地方。。。因此,即使您现在纠正了所有细微差别,并且您的站点在XSS脚本编写过程中是安全的,您可能会在某个时刻将用户输入添加到某个未转义的变量(或者更可能的是,某个变量到某个变量再到某个未转义的变量),这将使您面临XSS攻击
默认情况下逃逸可以防止这种攻击
另一个原因更具概念性:使用MVC,所有的标记(根据定义,“视图”)都应该在视图模板中。因此,如果您的控制器正在确定视图,并且视图包含所有标记,为什么不转义变量?有没有办法通过KO2和KO3自动执行此操作?