我的调查结果,到目前为止:
首先是写一个有效的HTML属性值的规则:但是这里的标准只要求(如果要是用引号括起来的属性值)任意CDATA(实际上是一种%URI,但是HTML本身并没有在其级别上进行额外的验证:任何CDATA都会验证)。
一些例子:
<a href="javascript:alert('Hi!')"> (1)
<a href="javascript:if(a > b && 1 < 0) alert( b ? 'hi' : 'bye')"> (2)
<a href="javascript:if(a>b &&& 1 < 0) alert(b ? 'hi' : 'bye')"> (3)
实施例(1)是有效的。但是例子(2)也是有效的HTML 4.01 Strict。为了使XHTML有效,我们只需要转义XML特殊字符< > &
(示例3是有效的XHTML 1.0 Strict)。
现在,示例(2)有效的javascript:
URI?我不确定,但我会说这不是。
从RFC 2396:一个URI受到一些额外的限制,特别是通过%xx
序列的escape/unescape。并且一些字符总是被禁止的: 其中的空格和{}#
。
RFC还定义了opaque URIs
的一个子集:那些没有分层组件并且分隔字符没有特殊含义的子集(例如,它们没有'查询字符串',所以可以使用?
作为任何非特殊字符)。我认为其中应该考虑使用javascript:
URI。
这将意味着一个javascript:
URI的“体”内的有效字符
a-zA-Z0-9
_|. !~*'();?:@&=+$,/-
%hh : (escape sequence, with two hexadecimal digits)
与它不能与/
开始额外的限制。 此剧照留下了一些“重要”的ASCII字符,例如
{}#[]<>^\
而且%
(因为它使用转义序列),双引号"
和(最重要的),全部为空白。
在某些方面,这看起来相当宽容:重要的是要注意+
是有效的(因此,当解码时,它不应该是'未转义',作为空间)。
但在其他方面,它似乎太严格了。大括号和括号,特别是:我明白,他们通常使用非转义和浏览器没有问题。
那么空间呢?作为大括号,它们被RFC所禁止,但我在这种URI中看不到任何问题。但是,我发现在大多数小书签中,它们被转义为“%20”。有没有(经验或理论)的解释呢?
我仍然不知道是否有一些标准函数来使这个escape/unescape(在主流语言)或一些示例代码。