【问题标题】:escaping inside html tag attribute value在 html 标签属性值内转义
【发布时间】:2012-02-08 04:42:09
【问题描述】:

我无法理解在 javascript 的 html 标记属性值中如何进行转义。

我被引导相信你应该总是逃避 & ' " 。所以我尝试将 javascript 作为属性值:

<a href="javascript:alert(&apos;Hello&apos;);"></a>

它不起作用。然而:

<a href="javascript:alert(&#39;Hello&#39;);"></a>

<a href="javascript:alert('Hello');"></a>

适用于所有浏览器!

现在我完全糊涂了。如果我所有的属性值都用双引号括起来,这是否意味着我不必转义单引号?还是 apos 和 ascii 39 在技术上是不同的字符?这样javascript需要ascii 39,而不是apos?

【问题讨论】:

标签: html escaping


【解决方案1】:

这里涉及到两种类型的“转义”,HTML 和 JavaScript。解释 HTML 文档时,首先解析 HTML 转义。

就 HTML 而言,属性值中的规则与其他地方相同,再加上一条附加规则:

  • 小于字符&amp;lt; 应该被转义。通常&amp;lt; 用于此目的。从技术上讲,根据 HTML 版本,并不总是需要转义,但它一直是很好的做法。
  • & 符号&amp;amp; 应该被转义。通常&amp;amp; 用于此目的。这也并非总是强制性的,但总是比在需要时学习和记住要简单。
  • 用作属性值周围分隔符的字符必须在其中进行转义。如果您使用 Ascii 引号 " 作为分隔符,通常使用 &amp;quot; 转义其出现,而对于 Ascii 撇号,实体引用 &amp;apos; 仅在某些 HTML 版本中定义,因此使用它最安全数字引用 &amp;#39;(或 &amp;#x27;)。

您可以根据需要转义&gt;(或任何其他数据字符),但从不需要。

在 JavaScript 方面,字符串文字中有一些转义机制(使用\)。但这是一个不同的问题,与您的情况无关。

在您的示例中,在符合当前规范的浏览器上,JavaScript 解释器看到完全相同的代码 alert('Hello');。浏览器“未转义”&amp;apos;&amp;#39;'。我有点惊讶&amp;apos; 这些天没有得到普遍支持,但这不是问题:很少需要在 HTML 中转义 Ascii 撇号(转义仅在属性值内需要并且仅当您使用 Ascii撇号作为其分隔符),如果有,您可以使用&amp;#39; 引用。

【讨论】:

  • 出于好奇,您能否详细说明一下何时需要转义和何时不需要?
  • @RakeshPai,这取决于 HTML 版本。根据 HTML 4.01 规则,如果紧跟一个 Ascii 字母(a-z、A-Z)或紧跟数字符号 # 和一个 Ascii 字母,则必须对 & 符号进行转义。
  • 有趣。这是有道理的,因为它会与其他类型的 HTML 实体发生冲突。谢谢。
  • 假设你试图打败 XSS,这个建议是不好的。 wonko.com/post/html-escaping "转义 &, , ", ', `, , !, @, $, %, (, ), =, +, {, }, [, 和 ] 就够了"
  • 正如您引用的文章所述,“所有这些字符(包括空格字符!)都可用于突破 unquoted HTML 属性值”。虽然转义所有这些字符可能没有任何缺点(性能除外),但如果您在其中扩展占位符,在 HTML 属性值周围使用引号会容易得多。
【解决方案2】:

&amp;apos; 不是有效的HTML reference entity。您应该使用&amp;#39; 转义

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 2012-04-21
    相关资源
    最近更新 更多