使用 constantize 的安全影响

har*_*arm 5 ruby security ruby-on-rails

我目前正在审查一些 Rails 控制器。该控制器接受用户输入,并根据该用户输入创建一个新对象,如下所示:

clazz = params[:type].classify.constantize
clazz.new(some_method_which_returns_filtered_params)
Run Code Online (Sandbox Code Playgroud)

我担心这种方法的安全性。Ruby 中是否存在可以恶意使用“新”方法的类?

例如,可能会用新符号淹没程序,导致拒绝服务(请参阅http://brakemanscanner.org/docs/warning_types/denial_of_service/)。

Max*_*ams 5

我建议在执行之前限制此代码将接受的 params[:type] 值。例如,如果块像

if %w(foos bars bazzes).include?(params[:type])
  clazz = params[:type].classify.constantize
  clazz.new(some_method_which_returns_filtered_params)
end
Run Code Online (Sandbox Code Playgroud)

我不认为 DOS 攻击是在这里进行分类的特定问题。constantize:如果有人向您的服务器发送垃圾请求,那么无论您在实际控制器中做什么,DOS 都会攻击您。

防止 DOS 攻击是很困难的。保护网络应用程序是一个庞大的主题,但特别是您似乎在这里谈论“清理参数”领域。看看 http://guides.rubyonrails.org/security.html

我无法抗拒链接到这个经典的 XKCD 条带:http ://xkcd.com/327/