1

当我在 environment.rb 中使用 ActionController::Base.param_parsers.delete(Mime::XML) 时它会破坏它,我将它放在文件 en 的初始化块之外。

我正在使用 nginx/passenger,有趣的是,当我将 ActionController::Base.param_parsers.delete(Mime::XML) 添加到我的开发实例时,它确实解决了问题,但是当我将它部署到生产环境时,它破坏了一切。

我真的不想升级到 Rails 3,因为这是遗留代码,我正在做一个辅助项目,但现在我只想拥有一个安全的应用程序。

谢谢你。

4

1 回答 1

2

你有一个最典型的 ./config/environment.rb 文件吗?

我把它放在两个地方:在初始化器中和最后的“end”关键字之前。YMMV。

# ./config/environment.rb
Rails::Initializer.run do |config|
  ...
  ActiveSupport::CoreExtensions::Hash::Conversions::XML_PARSING.delete('symbol')
  ActiveSupport::CoreExtensions::Hash::Conversions::XML_PARSING.delete('yaml')
end
ActiveSupport::CoreExtensions::Hash::Conversions::XML_PARSING.delete('symbol')
ActiveSupport::CoreExtensions::Hash::Conversions::XML_PARSING.delete('yaml')

要验证它是否有效,请使用本地开发服务器为 rails 2.x 运行此命令:

curl -i -H "Content-Type: application/xml" -X POST \
  -d '<id type="yaml">--- !ruby/object:ActionController::Base bar: 1</id>' \
  http://localhost:3000

查看您的日志。如果 params[:id] 是一个对象,那么你很容易受到攻击。如果它只是一个字符串,那么你的修复工作。[感谢 HackerNews 用户提供所有这些信息]

当我部署到Passenger 生产时,它让我大吃一惊。我通过重新启动 Apache 解决了这个问题。您可能想对 Nginx 进行同样的尝试。

我不是 100% 确定这是最好的方法,或者涵盖所有情况。此处的其他任何人都可以添加或编辑此内容以提供帮助。祝你好运!

于 2013-01-15T22:27:59.960 回答