Chinaunix首页 | 论坛 | 博客
  • 博客访问: 40197
  • 博文数量: 27
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 300
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-24 00:44
文章分类
文章存档

2011年(1)

2009年(26)

我的朋友
最近访客

分类: Java

2009-05-20 11:15:04

另外一种常见的攻击方式就是通过提交一些脚本:

例如我们在网页上显示comments, 并且有一个表格供用户提交新的comments, 那么用户如果在提交的内容中加入脚本命令,而我们没有做escape,那么这个脚本命令就会作为文本写入数据库,下次用户刷新网页的时候,这个脚本就会被执行。

例如用户提交的是:

那么以后刷新的时候,就会弹出一个hello的框框。

当然如果单单弹出一个窗口,没有什么好怕的,但是黑客可以利用这一点做更坏的事情,例如用户登陆之后,通过在提交的表单中加入一些脚本,可以将用户的cookie截获,发送到黑客的服务器,从而获得用户的cookie中的信息,例如session_id, 然后黑客就可以用cookie中的session信息来hijack 这个user。

要防止这种类型的攻击并不难,就是在将用户的输入显示在网页上的时候,将其escape一下,例如:
<%@task.comment.each do |comment|%>
   

<%=h(comment.content)%>


<%end%>

h这个辅助方法的作用,就是在网页上显示其中的文本之前,escape其中的敏感字符,例如"<"  ">"等等。
这样他们就不会作为脚本被网页执行了。
例如经过h之后,就会变成
<script>alert('a');</script>

h在ROR中起什么作用呢?它是 html_escape的alias(别名)

但是这种做法也有问题,所有的html tag都被搞掉了,如果我们故意要放行一些tag呢?
这样h这个方法就行不通了,还好我们有sanitize方法,

ROR API中:     Sanitizes the given HTML by making form and script tags into regular text, and removing all "onxxx" attributes (so that arbitrary Javascript cannot be executed). Also removes href attributes that start with "javascript:".

它会砍掉script这个tag,以及onXxxx之类的attribut,你没有机会执行javascript,但是你还可以塞一些div或iframe之类的tag让你的版面烂掉。

所以我们需要自定义一个html filter,可以自由的指定我们放行的那些tag。网上发现了这个sanitize.rb,完美的帮我们实现愿望。


除了在网页display的时候h一下以外,当然还有另外一种处理方式,就是用户提交的时候,就做一下h,但是这样的的话h就会出现在controller中了,但是controller是不能访问helper方法的,那么我们可以使用另外一个方法:
CGI::escapeHTML()

如果你只是需要在网页中显示这些文本的话,这种先escape,然后在存入数据的方法就很好用。但是如果你在其他地方会用到,那么escape也许就不好了,最好还是在output的时候escape。





阅读(827) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~