第14章: 附录(Additional Information)
By:IceskYsl At 2008.06.16
摘要:本章主要介绍跨站攻击(XSS)和CSRF攻击的防范;METHOD_MISSING的使用以及POSTGRESQL的支持改善。
防止跨站攻击(PROTECTING FROM CROSS SITE SCRIPTING)
在Rails2.0的application.rb中,你应该留意到如下这段代码:
class ApplicationController < ActionController::Base
helper :all
protect_from_forgery
end
请注意上面这段代码中对
protect_from_forgery的调用。
你听说过跨站(XSS)么?最近一段时间,XSS日益风行,就目前而言,在大多数的网站中都存在或多或少的XSS缺陷;而XSS缺陷会被一些怀有恶意的人利用,可以修改网站内容,钓鱼,甚至通过JS来控制其他用户的浏览器等。尽管攻击方式不同,但是其主要目的都是使得用户在不知情的情况下做了一些“邪恶”的事情。其最新的攻击手段为“cross-site request forgery”。
Cross Site Request Forgery和前面说的XSS原理差不多,但是其更有危害性,随着Ajax的日渐盛行,这类漏洞的利用空间和手段更加灵活。(补充:CSRF在这里介绍的不是很多,我以前写了一篇介绍CSRF的文章,感兴趣的请自行查看《
CSRF: 不要低估了我的危害和攻击能力》)
protect_from_forgery用来确保您的系统接收到的form信息都来自于你系统本身,而不会是从第三方提交过来的;其实现的原理是在你的form中和Ajax请求中添加一个基于session的标识(token),控制器接收到form的时候检查这个token是否匹配来决定如何响应这个Post请求。
另外,值得一提的是这个方法并不保护Get方式的请求,不过也无所谓,Get方式的只是取数据,而不会存数据到数据库中。
如果你想更多的了解CSRF (Cross-Site Request Forgery),请参考如下两个地址:
-
http://www.nomedojogo.com/2008/01/14/como-um-garoto-chamado-samy-pode-derrubar-seu-site/isc.sans.org/diary.html?storyid=1750
-
http://www.nomedojogo.com/2008/01/14/como-um-garoto-chamado-samy-pode-derrubar-seu-site/isc.sans.org/diary.html?storyid=1750
-
还有前面我说到的《CSRF: 不要低估了我的危害和攻击能力》。
请切记,这个方法不能保证万无一失,就像我们平时喜欢说的那样,他并不是银弹!
使用METHOD_MISSING时请留心(USED METHOD_MISSING, THEN DON'T LEAVE LOOSE ENDS)
由于Ruby是动态语言,这样就使得respond_to?非常重要,你是否经常检查某个对象是否拥有某个方法?你是否经常使用is_a?来检查某个对象正是我们需要的。
然而,人们常常忘记这么做,先看个例子使用
method_missing的例子吧:
class Dog
def method_missing(method, *args, &block)
if method.to_s =~ /^bark/
puts "woofwoof!"
else
super
end
end
end
rex = Dog.new
rex.bark #=> woofwof!
rex.bark! #=> woofwoof!
rex.bark_and_run #=> woofwoof!
我认为你肯定知道method_missing,在上面的例子中,我创建了一个
Dog类的实例变量,然后调用三个并不存在的方法
bark,
bark! 和
bark_and_run,他就会去调用method_missing按照我用正则表达式规定的只要方法是以bark开头,就输出woofwoof!。
没有什么问题,是吧?那么请继续看我使用respond_to?来检查下:
rex.respond_to? :bark #=> false
rex.bark #=> woofwoof!
看到没有,它返回
false,也就是说,他认为该对象并没有bark方法!怎么办?是时候来按照我们的规则来完善respond_to?了。
class Dog
METHOD_BARK = /^bark/
def respond_to?(method)
return true if method.to_s =~ METHOD_BARK
super
end
def method_missing(method, *args, &block)
if method.to_s =~ METHOD_BARK
puts "woofwoof!"
else
super
end
end
end
rex = Dog.new
rex.respond_to?(:bark) #=> true
rex.bark #=> woofwoof!
ok,没问题了!这杨的问题在Rails中普遍存在,你可以试试用
respond_to?来检查下
find_by_name方法就很明白了。
Ruby的扩展性能让人称奇,但如果你不注意,会把自己搞得一头雾水。
当然,你应该猜到我要说什么了,在Rails2.1中,这个问题已经修复了,不信的话,你可以使用
respond_to?再检测下
find_by_something试试看。
POSTGRESQL
在Rails2.0中,PostgreSQL 的适配器支持的版本从8.1到 8.3,而在Rail2.1中可以支持的PostgreSQL版本扩展到 7.4 到 8.3。