反正有没有让Rails / Rack应用程序告诉Web服务器断开连接

时间:2010-04-03 06:47:44

标签: ruby-on-rails security nginx rack owasp

有许多安全原因导致人们想要删除没有响应的HTTP连接(例如OWASP's SSL best practices)。如果可以在服务器级别检测到这些,那么这没什么大不了的。但是,如果您只能在应用程序级别检测到这种情况呢?

Rails,或者更普遍的Rack,是否有任何标准方法告诉服务器在没有响应的情况下断开连接?如果没有,是否有一些标准的标题可以在常见的Web服务器中实现(我在想Nginx或Apache)?即使没有标准头,是否有合理的方法来配置该行为?这是傻瓜的差事吗?

3 个答案:

答案 0 :(得分:6)

Nginx有一个机制。当您返回特殊状态代码444(它是非标准的)时,Nginx会静默地断开连接。只有当您从Nginx配置返回此代码时才会发生这种情况,例如

location = /drop {
  return 444;
}

并且您无法从应用程序返回此状态代码。解决方法是从应用返回X-Accel-Redirect: /drop标头,告知Nginx使用此/drop位置。

答案 1 :(得分:1)

我可能错了,但我不认为Rack或Rails提供了丢弃连接的方法。我认为最接近的可能是“render:nothing => true”。但即便如此讽刺地发送一些东西(单个空间,显然是为了避免Safari漏洞......)但至少它会终止请求而不是重定向(让客户发起新请求),如OWASP警告的那样。

class TestController < ApplicationController
  def nothing
    render :nothing => true
  end
end

>> app.get('test/nothing')
=> 200
>> app.response.body
=> " "

我希望有所帮助。

答案 2 :(得分:0)

请您详细说明“删除连接”是什么意思?如果使用您想要的任何响应代码(移动,未授权,未找到)发送回标头是可以的 - 您已经得到了答案(渲染:注意或:头部)。您可以添加:status =&gt; some_status。
如果你的意思是在TCP / IP级别上断开连接,那么防火墙也是如此,这是另一回事。我怀疑这是可能的。我认为不可取(如果可能的话) 在您发布的页面上,“drop connections”链接被用作拒绝HTTPS连接的同义词 - 意味着呈现一些状态为Unauthorized或类似的响应。