Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 是否总是在视图中转义输出?为什么?_Security_Zend Framework_View_Escaping - Fatal编程技术网

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

Security 是否总是在视图中转义输出?为什么?,security,zend-framework,view,escaping,Security,Zend Framework,View,Escaping,报告说: 60.3.1。转义输出 最重要的任务之一 在视图中执行脚本是为了 确保输出正确转义; 除其他外,这有助于 避免跨站点脚本攻击。 除非您使用的是函数, 方法,或执行转义的帮助器 就其本身而言,你应该总是逃避 当您输出变量时 为什么“总是”?为什么我必须转义那些没有被用户输入创建或更改的变量?好吧,如果你有硬编码的值(比如从数据库或XML文件读取的语言翻译),你就不必转义它们 但是,如果有一个值是由用户创建/修改的,即使是在管理面板中,你也必须避开它,因为你不知道用户或我是否更激进,甚至管

报告说:

60.3.1。转义输出

最重要的任务之一 在视图中执行脚本是为了 确保输出正确转义; 除其他外,这有助于 避免跨站点脚本攻击。 除非您使用的是函数, 方法,或执行转义的帮助器 就其本身而言,你应该总是逃避 当您输出变量时


为什么“总是”?为什么我必须转义那些没有被用户输入创建或更改的变量?

好吧,如果你有硬编码的值(比如从数据库或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 &amp; <b>bar</b>
foo&;酒吧

我认为这里的最佳实践始终是转义输出,除非您打算输出原始HTML片段。即使是“安全”数据也可能包含需要转义的字符。例如,考虑电子邮件地址“鲍伯”。如果您不转义它,浏览器会认为它是一个标记。

显然,您希望转义用户数据导致的内容,以防止XSS攻击。由于您经常更改正在重新发布的内容和未重新发布的内容,您可能记不起所有需要更改的地方。。。因此,即使您现在纠正了所有细微差别,并且您的站点在XSS脚本编写过程中是安全的,您可能会在某个时刻将用户输入添加到某个未转义的变量(或者更可能的是,某个变量到某个变量再到某个未转义的变量),这将使您面临XSS攻击

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


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

有没有办法通过KO2和KO3自动执行此操作?