6

我有一个托管在 Heroku 上的 Ruby on Rails 应用程序。

为了允许我们的应用程序进行安全审查,我们被告知要禁用一些 HTTP 方法。

“如果不使用,应用程序 Web 服务器必须配置为禁用 TRACE 和其他 HTTP 方法。”

Heroku 有可能吗?如果没有,有没有办法在应用程序级别禁用这些方法?

4

1 回答 1

13

在应用程序级别,您可以将其添加到 application_controller.rb 文件中

  before_filter :reject_methods

  def reject_methods
    if ['TRACE','PATCH'].include?(request.method)
      #raise ActionController::RoutingError.new('Not Found')
      raise ActionController::MethodNotAllowed.new('Method not allowed')  #405
      # or whatever you want to do (redirect, error message, ...)
    end
  end

或者您可以尝试使用https://github.com/jtrupiano/rack-rewrite(检查任意重写),如下所示(未测试):

rewrite %r{(.*)}, lambda { |match, rack_env|
  rack_env["REQUEST_METHOD"] == "TRACE" ? "405.html" : match[1]
}

或者您可以通过将其放入文件 ./lib 中来使用您自己的中间件:

module Rack

class RejectMethods
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, body = @app.call(env)

    if env["REQUEST_METHOD"] == "TRACE" || env["REQUEST_METHOD"] == "PATCH"
      body.close if body.respond_to? :close
      [status, headers, []]
    else
      [status, headers, body]
    end
  end
end

end

并在 application.rb 中调用它

config.autoload_paths += %W(#{config.root}/lib)

config.middleware.use "RejectMethods"
于 2013-07-04T16:05:09.203 回答