2

我目前正在开发一个 java 应用程序,它使用在 localhost 上运行的 tor 代理来获取显示请求者 ip 的脚本。

我希望这项工作主要由 tor 代理完成,以便它以最“自然”的状态工作。我当前的代码与此类似:

SocketAddress TorProxyAddress = new InetSocketAddress("127.0.0.1", 9050);
Proxy TorProxy = new Proxy(Proxy.Type.SOCKS, TorProxyAddress);
URL url = new URL("https://myhost.com/ip2.php");
URLConnection conn = url.openConnection(TorProxy);
// ... reading the input stream etc

我现在遇到的问题是来自 tor 代理控制台的以下警告消息:

[warn] Your application (using socks5 to port 443) is giving Tor only an IP address. Applications that do DNS resolves themselves may leak information. Consider using Socks4A (e.g. via privoxy or socat) instead. For more information, please see https://wiki.torproject.org/TheOnionRouter/TorFAQ#SOCKSAndDNS.'

对我来说,看起来 Java 正在解析 myhost.com 的 IP 地址,而我并不希望它这样做。如前所述,我需要在可能完美的环境中运行 tor 代理。

有什么办法可以防止java预先解析主机并将整个URL传递给tor代理?

非常感谢您的每一个回答!

4

1 回答 1

3

我自己找到了一个简单的答案,就像阅读 API 一样简单InetSocketAddress

要阻止 Java 预解析主机,只需使用:

InetSocketAddress unresolvedAdr = InetSocketAddress.createUnresolved(host, port);

如果您有兴趣,这是我的完整解决方案(在我使用 ssl-stuff 的特殊情况下):

TorProxyAddress = new InetSocketAddress("127.0.0.1", 9050);
Proxy TorProxy = new Proxy(Proxy.Type.SOCKS, TorProxyAddress);
Socket underlying = new Socket(TorProxy);

InetSocketAddress unresolvedAdr = InetSocketAddress.createUnresolved(host, port);
underlying.connect(unresolvedAdr);

SSLSocket socket = (SSLSocket) SockFactory.createSocket(underlying, "127.0.0.1", 9050, true);
// ... Read from / write to Socket
于 2013-05-11T15:09:12.190 回答