WEB安全第八课 浏览器端脚本 之四 脚本字符编码 |
JavaScript引擎支持好几种常见的反斜杠方式的字符串编码处理,用于转义引号、HTML标记和内嵌在文本里有问题的字符。这些方法包括:
a.对某些控制字符可以使用C风格的速记表达方法(shorthand notation):\b代表退格符,\t水平制表符,\v垂直制表符,\f换页符,代表回车符和\ri代表换行符。ECMAScript和JSONRFC都支持这套转义符系统。 b.3位数字,不足的位数以零填充,按8位原字节八进制字符编码的方式,无前缀(如“\145”代表“e”)。这种衍生自C风格的语法原本并不属于ECMAScript的规范,但实际上各种脚本引擎里的常规JavaScript代码和JSON.parse(...)都支持这种转义。 🤙⛪🍼🈴🐺 c.2位数字,不足的位数以零填充,按8位原字节16进制字符编码的方式,前缀为“x”(所以“e”变成“\x65”)。和上一条一样,这项编码并非ECMAScript或RFC4627里的规定,而是源自C语言,但实际上也获得广泛的支持。 d.4位数字,不足的位数以零填充,按16位原字节的16进制Unicode数值编码,前缀加“u”(“e”变成“\u0065”)。这是ECMAScript和RFC4627规定的编码方式,也为所有常见浏览器支持。 👮♂️👗🖲🤔👃 e.反斜杠后面跟的是非8进制的数字,也非这些字符“b”、“t”、“v”、“f”、“r”或“n”,并且也不是“x”和“u”,则可以使用反斜杠转义。这种方式下,就按反斜杠后面字符的字面含义直接处理。ECMAScript本来只用这种方式来转义引号和反斜杠字符本身,但实际上,对其他的字符也同样有效。 这种做法其实很容易出现问题,和CSS—样,不应该用这种方式来转义尖括号和其他HTML语法里的分隔符(delimiter)。这是因为JavaScript的解析顺序要晚于HTML的解析,而HTML解析器自身并不认识这种反斜杠的转义方式。 注意:有个颇为隐秘的地方,IE浏览器实际上并不支持垂直制表符(“\V’)这种简化写法,所以,我们可以写出一条很简单(但非常不合规矩!)的代码来测试出是否为IE浏览器: 🧑🍳🧥🛋😂✍ [mw_shl_code=javascript,true] if("\v"=="v")alert("Looks like Internet Explorer!"); [/mw_shl_code] 💅🦼🥣🆘🦮 令人吃惊的是,上述各种编码里,只有Unicode转义方式还可以用在字符串之外的位置,而其他的转义方式则不行。尽管这么做看起来有点随便,但这种做法却比CSS里的处理要稍微合理些:因为在JavaScript里,转义编码只能出现在标识符(identifiers)部分,却不能用于对语法有真正影响的符号里。因此以下写法是可以的: [mw_shl_code=javascript,true] \u00611ert("This displays a message!"); [/mw_shl_code] ✋⛵🍚🈸🦮 而另一方面,想用这种方式来替换圆括号或者引号,却会失败。 和某些C或C++的实现不同,任何JavaScript引擎都不接受字符串跨行的写法。但尽管ECMAScript规范里有一堆不允许的写法,仍然有一个例外:位于行末的单个反斜杠可以无缝地连接多行的字面量。该行为描述如下: 👨🦱🧦🦯🥱👀 [mw_shl_code=javascript,true] var text = '这个写法 是错的。'; var text = '这个写法,则相反,\ 对所有浏览器来说都是OK的。';[/mw_shl_code] 🤙🌧🥛ℹ🦕
帖子热度 8830 ℃
糟糕!小执念长得太帅路遇劫匪,赎金 1 个 金币.
|
|
看见你们在厚颜无耻的刷经验,还刷的这么俗不可耐,对于你们这种丧心病狂令人发指的行为,我真的很想说:请带上我!
|