Today's the day

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

Mac 下搭建 Rails 环境
Chito 构架更新

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

galeki posted @ 2010年5月30日 13:24 in RoR with tags xss , 4421 阅读

所谓的 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。

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

 

  • 无匹配
netwjx 说:
2010年6月29日 19:56

还可以这样
<scriptoff length="1500">
.......1500个字符
</scriptoff>

Avatar_small
galeki 说:
2010年6月30日 22:05

的确,这也是个好办法~


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter