我目前正在审核一些Rails控制器。该控制器接受用户输入,并根据该用户输入创建一个新对象,如下所示:
clazz = params[:type].classify.constantize
clazz.new(some_method_which_returns_filtered_params)
我关心这种方法的安全性。 Ruby中是否存在可以恶意使用“新”方法的类?
例如,可能会使用新符号导致程序泛滥而导致拒绝服务(请参阅http://brakemanscanner.org/docs/warning_types/denial_of_service/)。
答案 0 :(得分:4)
我建议在执行之前限制此代码为params [:type]接受的值。例如,使用像
这样的if块if %w(foos bars bazzes).include?(params[:type])
clazz = params[:type].classify.constantize
clazz.new(some_method_which_returns_filtered_params)
end
我不认为DOS攻击是在这里进行classify.constantize的一个特定问题:如果有人用你的请求来摧毁你的服务器,那么无论你在实际的控制器中做什么,都会攻击你。
防止DOS攻击很难。保护网络应用程序是一个巨大的主题,但特别是你似乎在谈论这里的“消毒参数”领域。看一下 http://guides.rubyonrails.org/security.html
我无法抗拒链接到这个经典的XKCD条:http://xkcd.com/327/