既然我无法停留,那么就飞到我再也不能飞的那一天吧。 收藏本站
登陆 / 注册 搜索

阅读:1.2万   回复: 3

WEB安全第七课 层叠样式表 之三 字符编码

[复制链接]
小执念 古黑浩劫论坛大牛 2016-6-26 22:20 |显示全部楼层

可遇不可求的事:故乡的云,上古的玉,随手的诗,十九岁的你。

管理员
        为了在CSS字符串里使用一些保留字符或有问题的字符,CSS提供了一套不太正统的转义处理策略:用一个反斜杠(\)后面跟1〜6位的十六进制数字。

        例如,根据这个策略,字母e可以编码为“\65”、“\065”以及“\000065”。但是,如果字母e后面紧挨着的字符就是一个有效的十六进制数字时,这三种写法里只有最后一种是不会产生歧义的;因为把“teak”编码成“t\65ak”就有问题了,此时转义序列会按照“\65A”来解析,这就变成Unicode里一个阿拉伯语符号了。

WEB安全第七课 层叠样式表 之三 字符编码 binary-code-matrix-style1.jpg
        👩‌🩳🔍🤬🙌
        为避免这一问题,CSS规范给出了一个很笨拙的妥协方案,就是在每个转义序列后面再加一个空格符作为终止的标识,要还原字符串时再移除这个空格符(例如:“t\65ak”)。真遗憾,其实可以采用更为人熟知、具有固定长度的C风格转义序列,如\x65
        
        除了数字形式的转义之外,还可以在一个非十六进制数字的字符前加反斜杠作为转义处理。采用这种方式时,紧跟在转义符后的那个字符就按字面意思直接解析了。这种机制可以用来转义引号字符和反斜杠本身,但不能用于转义由HTML控制的字符,如尖括号。此前提到的HTML解析优先于CSS解析顺序,会使这种处理出现问题。
        
        由于W3C草案里一些语焉不详的规定,导致了某些颇为荒谬的差异,所以许多CSS解析器对本该用引号括起的字符串里的任意转义序列。更加雪上加霜的是,在IE浏览器里,对转义序列解析的优先级甚至要高于对伪函数语法的解析,结果导致以下两个例子效果其实是一样的:

👩‍✈️‍🎒🪟😡🖕


        
引用

        color:expression(alert(1))
        color:expression\028 alert \028 1 \029 \029


       而更复杂的是,出于对代码容错性的无度追求,在微软的浏览器实现里,url(...)值里的反斜杠符号却不会被识别成转义符,这种做法,仅仅为了照顾那些输人URL时输错成反斜杠的用户的感情。
        👨🦱‌👙📞🥲👀
        林林总总的类似问题,导致要检测一个已知的有危害性的CSS语法变得非常容易出错。#389:

WEB安全第八课第一节:浏览器端脚本 之一 JavaScript
上一篇
下一篇
帖子热度 1.2万 ℃
小执念殷勤地给楼主揉揉肩捶捶背,楼主奖励2 个 金币.

暮色里的白雪檐 「出类拔萃」 2017-9-17 20:14 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

OMG!介是啥东东!!!
雾月 「出类拔萃」 2018-5-1 16:26 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

我也是坐沙发的
放我一个人生活 「出类拔萃」 2018-5-3 23:36 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

#j347:我支付宝都不集福就服你
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

快速回复 返回列表