【问题标题】:htmlspecialchars - different escaping for attributes compared to everything else?htmlspecialchars - 与其他所有内容相比,属性的不同转义?
【发布时间】:2014-07-04 19:34:36
【问题描述】:

我一直在阅读 htmlspecialchars() 以从数据库中转义用户输入和用户输入。在任何人说什么之前,是的,我正在过滤数据库输入以及使用带有绑定的准备好的语句。我只关心保护输出。

我对何时使用ENT_COMPATENT_QUOTESENT_NOQUOTES 感到困惑。我在进行研究时发现了以下摘录:

htmlspecialchars() 调用中的第二个参数是ENT_COMPAT。我有 使用它是因为它是一个安全的默认值:它也会逃脱 双引号字符"。你只有在你真正需要的时候才需要这样做 在 HTML 属性中输出(如 <img src="<?php echo htmlspecialchars($img_path, ENT_COMPAT, 'UTF-8')">)。你可以使用 ENT_NOQUOTES 其他任何地方。

我在其他地方也发现了类似的 cmets。为属性转换单引号和/或双引号而不在其他地方转换它们的目的是什么?我唯一能想到的是,例如,如果您将实际的 html 添加到页面中:

我的变量是:<img src="somepic.jpg" alt="some text"> 如果您在此处转换双引号,则由于转义引号,它将无法正确呈现。在摘录中给出的示例中,尽管我什至想不出使用任何类型引号的实例。

其次,在这个特定的参考资料中,它说在其他任何地方都使用ENT_NOQUOTES。为什么?我个人的思考过程告诉我在任何地方都使用 ENT_QUOTESENT_NOQUOTES 当且仅当变量是需要它们的实际 html 属性时。

我已经做了很多搜索和阅读,但仍然对所有这些感到困惑。我的主要目标是保护页面的输出,因此不会发生 html、php、js 操作。

【问题讨论】:

  • @MarcB 你阅读理解失败。他说数据库,而不是数据库。
  • 马克...是的,不开玩笑...我想您可能错过了一些帖子。

标签: php security htmlspecialchars


【解决方案1】:

只需在任何地方使用ENT_QUOTES。 PHP 会在您需要时提供选项,但 99% 的情况下您不需要。不必要地转义引号是无害的。

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

因为代码太长了,不能到处写,所以把它包装在一些小函数中。

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

【讨论】:

  • 嗯,你刚刚验证了我的想法,所以我猜我想太多了。
【解决方案2】:

在 HTML 中有不同的上下文,不同的字符被认为是特殊的。例如,在double-quoted attribute value 中,文字双引号将被解释为属性值分隔符:

8.2.4.38 属性值(双引号)状态

使用next input character:

U+0022 引号 (")
切换到after attribute value (quoted) state

U+0026 与号 (&)
切换到character reference in attribute value stateadditional allowed character 为 U+0022 引号 (")。

U+0000 NULL
Parse error。将 U+FFFD REPLACEMENT CHARACTER 字符附加到当前属性的值。

EOF
Parse error。切换到data state。重新使用 EOF 字符。

其他的
current input character 附加到当前属性的值。

在这种情况下,双引号需要使用character reference 进行编码。单引号属性值类似,但这里第一个单引号文字被视为属性值结束分隔符。

类似的也适用于 data 上下文,即。例如,在标签之外:

8.2.4.1 数据状态

使用next input character

U+0026 与号 (&)
切换到character reference in data state

"
切换到tag open state

U+0000 NULL
Parse error。发出 current input character 作为字符标记。

EOF
发出文件结束标记。

其他的
发出 current input character 作为字符标记。

如您所见,就跨站脚本而言,唯一会被视为有害的字符是 <,因为它会切换到 tag open 上下文。所以这需要使用字符引用进行编码以避免标签的注入。

但是,也允许使用字符引用而不是文字字符,即使它们在相应的上下文中并不特殊,甚至根本不特殊。例如,以下是等价的:

<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;">

因此,根据上下文,实际上只需要将某些特殊字符编码为字符引用,但编码在其他上下文中也是特殊的其他字符也没有害处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 2020-07-02
    • 1970-01-01
    相关资源
    最近更新 更多