Today's the day

向软件大牛炫耀我会焊单片机,向硬件大牛炫耀我会写 Rails,向软硬件大牛炫耀我生物,向软硬件生物大牛炫耀我会折腾期货 -_-bbb

可以把 Anti-XSS 的功能交给浏览器吗?

所谓的 XSS 就是用户提交的内容中含有恶意的 js 代码,之后这段代码又被展现在特定的地方被执行了,所以就可以在浏览者当前的会话下执行 js 内容,比如偷取 cookie 或者发送 ajax 请求什么的。

虽然可以全部将用户提交的内容转义(比如 CGI.escape 或 Rails 中的 h 方法),但是很多时候还是希望接收用户提供的 html 代码,来展示样式、图片、连接之类。

这样就只好用白名单(比如 Rails 里面的 sanitize),过滤掉不想要的标签和属性,比如 <script> 标签,还有 onfocus onload 这些属性,但是这样消耗资源不说,还是不能解决问题。因为在一些其他的地方还是可以出发 js 的执行,比如 src"javascript:xxx" 这种形式,还有诸多意想不到的混乱式写法都可以触发 js。

这次升级至 Rails 2.3.8,切换到 Erubis,默认转义 html 内容和那个 html_safe 的方法的确可以避免一些无意间把 html 内容展示出来的情况,但是对那种就是要展示用户 html 代码的情况没有帮助。

于是开始想为啥浏览器不提供这种功能,例如提供个 <scruptoff> 和 <scripton> 两个标签,在 <scriptoff> 之后不做任何 js 解析,除非再被 <scripton>:

<scriptoff />

...用户内容

<scripton />

这样还是没有解决问题,因为用户也可以输入 <scripton /> 把 js 打开,那么可以给标签指定一个随机 key,只有 key 相同,才可以再次打开或关闭 js:

<scriptoff key="8C5D24E"/>

...用户内容

<scripton key="8C5D24E"/>

用 Rails 的 Helper 很容易生成这类标签,用户输入的内容却不能猜出 key 是什么所以不能打开 js。

这样就省事多了。不过应该还有什么没考虑到的情况吧……