防止来自HttpURLConnection的未经请求的CONNECT方法调用

时间:2015-10-27 14:36:11

标签: java android heroku httpurlconnection

我正在使用HttpURLConnection以下内容:

String strURL = "https://example.herokuapp.com";
Bitmap bmImage = null;
HttpURLConnection connection = null;
InputStream in = null;
showMessage(context.getString(R.string.message_preparing));
try {
    int timeoutMS = 15000;
    URL url = new URL(strURL);
    connection = (HttpURLConnection) url.openConnection();
    connection.setDoInput(true);
    connection.setConnectTimeout(timeoutMS);
    connection.setReadTimeout(timeoutMS);
    connection.connect();
    in = connection.getInputStream();
    BitmapFactory.Options options = new BitmapFactory.Options();
    bmImage = BitmapFactory.decodeStream(in, null, options);
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if (connection != null)
        connection.disconnect();
    if (in != null) {
        try {
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

return bmImage;

这很好用,由strURL定义的网址返回一个bmp图像,这个被解码,可供上面的代码使用。

但是对于一个特别的用户来说,虽然代码可以很好地获取bmp图像,但是在服务器(heroku的node.js服务器)上很明显,他们也发送了一个CONNECT请求。设备。该请求被自动拒绝503响应,所以这不是问题,bmp仍然发送到他们的设备,但我想知道为什么要发送这些CONNECT请求,以及如何阻止他们。当然除了GET请求之外什么都没有?

我已经尝试过this solution似乎是一个类似的问题了,但这对我没有任何影响。

请注意,strURL是https服务器,我使用HttpURLConnection(不是Https) - 不确定是否有任何重要性。

我也不是100%确定CONNECT请求来自上述调用,但它们肯定与提供bmp的GET请求大致同时发生。也许它可能是由我的代码之外的操作系统生成的?不确定。

如果有帮助,来自heroku的示例日志消息响应其中一个CONNECT请求,如下所示:

Oct 27 14:14:25 example heroku/router: at=error code=H13 desc="Connection closed without response" method=CONNECT path="example.herokuapp.com:443" host=example.herokuapp.com request_id=353e623x-dec4-42x5-bcfb-452add02ecef fwd="111.22.333.4" dyno=web.1 connect=0ms service=1ms status=503 bytes=0
编辑:相关设备实际上可以在彼此的短时间内完成两个独立的GET请求(完全独立和合法的请求)也是相关的,但是只有一个CONNECT请求明显(大约相同)时间作为一对GET请求)。因此,并不是每个GET都有一个CONNECT。

1 个答案:

答案 0 :(得分:2)

CONNECT方法可以将请求添加到HTTP服务器(代理服务器或源服务器),它基本上意味着:

  

“顺便说一句,老兄,你不介意转发我说的这些东西   我刚才提到主持人/港口的“逐字”,不是吗?   真的不需要真正关注我说的话。“

通常,这将是对代理的指令,“让路”,并让请求者(可能是用户代理或其他代理)直接与上游服务器通信。

如果您和原始服务器之间存在其他不合作(可能过时)的代理,那么这是一个很好的工具。如果你是一名黑客并希望配置错误的原始服务器能够轻松地进入内部网络,这也很方便。

但是,除非您对网络有完全的了解并且“知道”路径中只有一个代理,否则您需要“堆叠”CONNECT标头,直到您拒绝为止。

例如:

CONNECT site.example.com 80 HTTP/1.1
CONNECT site.example.com 80 HTTP/1.1
GET /foo HTTP/1.1
Host: site.example.com

....将要么通过2个干扰,无用的上游代理;或者让你通过实际存在的1,并从原始服务器获得503 ...因此,你将不得不用一个CONNECT前言方法重复你的请求。

因此,这将解释到目前为止所看到的行为。

然而,尚不清楚的是世界卫生组织正在增加CONNECT前言?!为什么他们不喜欢代理?

可能是:

  1. 用户代理上的代码(您的客户端智能手机上的Android应用使用HttpUrlConnectionHttpsUrlConnection(如果网址具有openConnection()方案,则由https://自动使用) ;
  2. 用户代理和源服务器之间的任何代理,由于某种原因不信任其上游代理或需要通过代理隧道HTTPS,否则只支持HTTP (这是什么CONNECT for
  3. 一个遭到黑客攻击的代理,正在寻找愚蠢的原始服务器来利用......但为什么要等到有人真正需要东西,麻烦原始服务器呢?
  4. CONNECT方法的完整内容以及数据包的源IP将非常有趣。我打赌#2,并预测如果您通过CONNECT网址访问该网站,则不会看到http://

    没有任何关于它的事情。