3

有许多安全原因导致人们想要在没有响应的情况下断开 HTTP 连接(例如,OWASP 的 SSL 最佳实践)。当这些可以在服务器级别检测到时,这没什么大不了的。但是,如果您只能在应用程序级别检测到这种情况怎么办?

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

4

3 回答 3

8

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

location = /drop {
  return 444;
}

并且您不能从您的应用程序中返回此状态代码。解决方法是从应用程序返回X-Accel-Redirect: /drop标头以告诉 Nginx 使用/drop该请求的位置。

于 2010-04-04T08:26:04.023 回答
2

我可能是错的,但我不认为 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
=> " "

我希望这会有所帮助。

于 2010-04-03T10:48:52.790 回答
0

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

于 2010-04-03T17:11:26.217 回答