转义html标签属性值

Myf*_*wik 18 html escaping

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

我一直相信你应该总是逃避&'"<>.所以对于javascript作为属性值,我试过:

<a href="javascript:alert(&apos;Hello&apos;);"></a>
Run Code Online (Sandbox Code Playgroud)

它不起作用.然而:

<a href="javascript:alert(&#39;Hello&#39;);"></a>
Run Code Online (Sandbox Code Playgroud)

<a href="javascript:alert('Hello');"></a>
Run Code Online (Sandbox Code Playgroud)

适用于所有浏览器!

现在我完全糊涂了.如果我的所有属性值都用双引号括起来,这是否意味着我不必转义单引号?或者是as和ascii 39技术上不同的角色?这样的javascript需要ascii 39,但不是吗?

Juk*_*ela 35

这里涉及两种类型的"转义",HTML和JavaScript.解释HTML文档时,首先解析HTML转义.

就HTML而言,属性值中的规则与其他地方的规则相同,另外还有一条规则:

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

>如果您愿意,可以转义(或任何其他数据字符),但从不需要它.

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

在您的示例中,在符合当前规范的浏览器上,JavaScript解释器会看到完全相同的代码alert('Hello');.浏览器有"转义" &apos;&#39;'.我对此感到有些惊讶&apos;,但这并不是普遍支持的,但这不是一个问题:很少有任何需要在HTML中转义Ascii撇号(仅在属性值中需要转义,并且仅当您使用Ascii撇号作为其分隔符),当有,你可以使用&#39;引用.

  • 正如您引用的文章所述,"那里的所有字符(包括空格字符!)都可用于打破_unquoted_HTML属性值".虽然可能没有任何缺点(性能除外)以逃避所有这些字符,但如果要在其中展开占位符,则更容易在HTML属性值周围使用引号. (3认同)