我一直在阅读了关于htmlspecialchars()
从数据库逃逸用户输入和用户输入。 之前有人说什么,是的,我对滤波输入数据库以及使用绑定的预处理语句。 我只关心如何保护输出。
我很困惑,何时使用ENT_COMPAT
, ENT_QUOTES
, ENT_NOQUOTES
。 我碰到下面摘录出来,在做我的研究:
在第二个参数htmlspecialchars()
调用是ENT_COMPAT
。 我使用的,因为它是一个安全的默认:它也将逃脱双引号字符"
你只有真正需要做的,如果你的HTML属性中输出(如。 <img src="<?php echo htmlspecialchars($img_path, ENT_COMPAT, 'UTF-8')">
)。你可以使用ENT_NOQUOTES
其他任何地方。
我也发现了类似的评论在其他地方也是如此。 什么是将单和/或双引号的属性的目的尚未转换到其他位置? 我能想到的唯一的事情是,如果你是在加入实际的HTML到例如页面:
我的变量是: <img src="somepic.jpg" alt="some text">
如果你转换的双引号这里,将无法正确呈现,因为转义引号的。 在摘录,虽然我也别想在那里将被用于任何类型的引用的实例给出的例子。
其次,在这个特别提到它说,使用ENT_NOQUOTES
其他任何地方。 为什么? 我个人的思维过程是告诉我使用ENT_QUOTES
无处不在, ENT_NOQUOTES
当且仅当变量是需要他们实际的HTML属性。
我已经做了很多的搜索和阅读,但仍然困惑了这一切。 我的主要目标是输出固定的页面,所以没有HTML,PHP,JS操纵发生。
只需使用ENT_QUOTES
无处不在。 PHP给出了在你需要它的情况下的选择,但你没有99%的时间。 摆脱不必要的报价是无害的。
htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
由于代码是太长时间保持写作处处把它包在一些微小的功能。
function es($string) {
return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
在HTML有哪里不同的字符被视为特殊差别上下文。 例如,内双引号中的属性值 ,字面双引号将被解释为属性值分隔符:
8.2.4.38属性值(双引号)状态
消耗了下一个输入文字 :
↪U + 0022引号(“)
切换到后属性值(报价)的状态 。
↪U + 0026(&)符号
切换到在属性值状态字符引用 ,与附加字符允许被U + 0022引号(“)。
↪U + 0000 NULL
解析错误 。 追加一个U + FFFD替换字符字符添加到当前属性的值。
↪EOF
解析错误 。 切换到数据状态 。 Reconsume EOF字符。
↪ 别的
追加电流输入字符到当前属性的值。
在这种情况下,双引号需要使用被编码的字符的参考 。 单引号中的属性值是相似的,但这里的第一行文字单引号被认为是属性值结束符。
类似的也同样适用于数据方面,即标签外:
8.2.4.1数据状态
消耗了下一个输入文字 :
↪U + 0026(&)符号
切换到在数据状态字符引用 。
↪ “<”(U + 003C)
切换到标签打开状态 。
↪U + 0000 NULL
解析错误 。 发射电流输入字符作为字符令牌。
↪EOF
发射结束文件的标记。
↪ 别的
发射电流输入字符作为字符令牌。
正如你所看到的,这将在跨站脚本的问候被认为是有害的唯一字符<
,因为它会切换到标签打开上下文。 因此,这将需要使用字符引用,以避免标签的注入进行编码。
然而,它也允许使用字符引用,而不是字面字符,即使他们没有在相应的范围内,甚至在所有的特别。 例如,以下是等效的:
<a href="http://example.com/">
<a href="http://example.com/">
所以,真的只需要某些特殊字符编码为根据上下文字符引用,但它不会伤害到编码其他字符在其他情况下是奇特。
文章来源: htmlspecialchars - different escaping for attributes compared to everything else?