gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:15:21 29 4
gpt4 key购买 nike

我正在按照以下行使用 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 定义的 url 返回一个 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。

最佳答案

CONNECT 方法可以开始向 HTTP 服务器(代理服务器或源服务器)发出请求,它的基本含义是:

"By the way, old chap, you wouldn't mind relaying this stuff I say 'verbatim' to the host/port I happen to mention, would you? No need to actually pay attention to what I'm saying, really."

通常这是给代理的指令,“让开”,让请求者(可以是用户代理或另一个代理)直接与上游服务器对话。

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

但是,除非您非常了解网络并且“知道”您的路径中只有一个代理,否则您将需要“堆叠”CONNECT header ,直到您被拒绝。

例如:

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 preface-methods 重复你的请求。

所以这可以解释到目前为止看到的行为。

但是,不清楚是谁在添加CONNECT 前言?!为什么他们不喜欢代理?

可能是:

  1. User-Agent 上的代码(您客户端智能手机上的 Android 应用程序使用 HttpUrlConnectionHttpsUrlConnection(由 openConnection() 自动使用,如果该 URL 具有 https:// 方案);
  2. User-Agent 和原始服务器之间的任何代理,出于某种原因不信任其上游代理或需要通过代理隧道 HTTPS,否则仅支持 HTTP(这是什么CONNECT 用于)
  3. 一个被黑客攻击的代理,正在寻找愚蠢的原始服务器来利用……但为什么要等到有人真正需要东西时,才去干扰原始服务器?

CONNECT 方法的完整内容,以及数据包的源 IP 会很有趣。不过,我打赌 #2,并预测如果您通过 http:// URL 访问该站点,您将看不到 CONNECT

对此无能为力。

关于java - 防止来自 HttpURLConnection 的未经请求的 CONNECT 方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33370798/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com