新手问题 rails 做的站是不是没有 xss 问题

Peter · 2013年06月28日 · 最后由 huacnlee 回复于 2013年06月28日 · 3883 次阅读

这两天我有 php 的站被 xss 攻击了,可能拿到 admin 权限,上传了木马。

rails 过滤应该是自动的吧,没道理让 <script> 这种标签进库吧

Rails 2 没有解决这个问题 Rails 3 要好很多了

不一定,看你把用户的输入用在什么场景 如果是作为 HTML 的一部分,Rails 默认的行为会转义几个关键字符,基本不会有问题 而其他场景依然可能会遇到安全问题,比如下面这种情况还是比较常见的吧

<script>
var page = <%= params[:page] %>
</script>

假如这个输入的值是 1;alert(1) ,那么默认的转义行为也救不了你,所以上面这种场景最好是这样做

<script>
var page = parseInt("<%= params[:page] %>")
</script>

#1 楼 @iBachue #2 楼 @blacktulip #3 楼 @edokeh 谢谢你们

如果不让用户输入 html,直接用 markdown 应该会好很多吧。

如果遇到<>直接换成&lt; &gt;,最后输出到页面的时候看源码也是&lt; &gt;,但浏览器自动会输出<>,这样根本就没有可能让用户的输入成为 javascript,这是不是就绝对安全了?

@edokeh 说的场景我觉得不太容易用到,<script>里面的参数我一般不会让用户参与的。

@Peter 恩,看业务场景吧,我这边还是经常用到这种情况的 Rails3 的机制虽然很棒,但是会让人麻痹,以为万事大吉了,有时候还是要小心

推荐撸主看看刺总的书 白帽子讲 web 安全 大部分漏洞其实都是业务层面的 就算让用户输入 html 过滤做的 ok 也没问题的

#3 楼 @edokeh

parseInt("<%= params[:page] %>") 还是有问题,例如 page 可以是 '" + alert(1) + "'

正确的做法是

var page = <%== params[:page].to_json %>

另外 rails 的 to_json 比标准库的 json 更安全,它会把字符串中带的 "</script>" 也转义掉的。

@luikore 引号会被转义的啊

#8 楼 @edokeh 好吧我这个例子不对,但如果参数以反斜线结束页面就坏了:

var page = "<%= '\\' %>"

恩,所以说 HTML 转义不是万能的,还是要看场景嘛 @luikore

#10 楼 @edokeh 所以填给 js 的一致用 to_json 就好了

用 Brakeman 来检测

需要 登录 后方可回复, 如果你还没有账号请 注册新账号