代码之家  ›  专栏  ›  技术社区  ›  gtd

有没有什么可以让rails/rack应用程序告诉web服务器断开连接

  •  2
  • gtd  · 技术社区  · 15 年前

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

    rails,或者更常见的rack,是否有任何标准的方法告诉服务器在没有响应的情况下断开连接?如果没有,是否有一些标准的头文件可以在普通的web服务器(我认为是nginx或apache)中传递?即使没有标准头,是否有合理的方法来配置该行为?这是傻事吗?

    3 回复  |  直到 8 年前
        1
  •  6
  •   Alexander Azarov    15 年前

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

    location = /drop {
      return 444;
    }
    

    并且不能从应用程序返回此状态代码。解决办法是返回 X-Accel-Redirect: /drop 来自应用程序的标题,告诉nginx使用 /drop 此请求的位置。

        2
  •  1
  •   mikewilliamson    15 年前

    我可能是错的,但我不认为机架或导轨提供了一种方法来断开连接。我认为最接近的可能是“render:nothing=>true”。但即使这样也会发送一些信息(单个空间,显然是为了避免safari错误……),但至少它会终止请求,而不是像owasp警告的那样重定向(让客户端启动新请求)。

    class TestController < ApplicationController
      def nothing
        render :nothing => true
      end
    end
    
    >> app.get('test/nothing')
    => 200
    >> app.response.body
    => " "
    

    我希望这会有帮助。

        3
  •  0
  •   Art Shayderov    15 年前

    请你详细说明一下“断开连接”是什么意思好吗?如果用您想要的任何响应代码(移动、未授权、未找到)发送回头是可以的,那么您已经得到了答案(render:noting,or:head)。您可以添加:status=>某些状态。
    如果你的意思是断开TCP/IP级别的连接,就像防火墙一样,那么这是另一回事。我怀疑这是可能的。我认为不可取(如果可能的话)。
    在您发布的页面上,“删除连接”的链接被用作拒绝https连接的同义词-意味着以未授权状态或类似的方式呈现某些响应。