用htmlspecialchars - 不同的转义属性相比其他一切?(htmlspecialcha

2019-10-20 09:33发布

我一直在阅读了关于htmlspecialchars()从数据库逃逸用户输入和用户输入。 之前有人说什么,是的,我对滤波输入数据库以及使用绑定的预处理语句。 我只关心如何保护输出。

我很困惑,何时使用ENT_COMPATENT_QUOTESENT_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操纵发生。

Answer 1:

只需使用ENT_QUOTES无处不在。 PHP给出了在你需要它的情况下的选择,但你没有99%的时间。 摆脱不必要的报价是无害的。

htmlspecialchars($string, ENT_QUOTES, 'UTF-8');

由于代码是太长时间保持写作处处把它包在一些微小的功能。

function es($string) {
  return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}


Answer 2:

在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="&#x68;&#x74;&#x74;&#x70;&#x3a;&#x2f;&#x2f;&#x65;&#x78;&#x61;&#x6d;&#x70;&#x6c;&#x65;&#x2e;&#x63;&#x6f;&#x6d;&#x2f;">

所以,真的只需要某些特殊字符编码为根据上下文字符引用,但它不会伤害到编码其他字符在其他情况下是奇特。



文章来源: htmlspecialchars - different escaping for attributes compared to everything else?