如何使用隐藏的Web服务器HttpSendRequest

时间:2014-05-11 07:22:01

标签: http file-upload tor

我正在尝试使用以下代码将数据从应用程序发送到在Web服务器上运行的php脚本:

#define server_add "mywebsite.com"
HINTERNET h = InternetOpen(USER_AGENT,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
h = InternetConnect(h,CNC,INTERNET_DEFAULT_HTTP_PORT,"","",INTERNET_SERVICE_HTTP,0,0);
h = HttpOpenRequest(h,"POST",server_add,NULL,NULL,NULL,0,0);
HttpSendRequest(h,"Content-Type: application/x-www-form-urlencoded\r\n",47,buffer,strlen(buffer)) //buffer is holding data that I want to send
InternetCloseHandle(h);

当server_add设置为clearnet地址(例如mywebsite.com)时,代码有效,当server_add设置为隐藏的服务器地址(例如http://mywebsite.onionhttp://mywebsite.tor2web.org时),HttpSendRequest失败。

有人能指出我将数据发送到隐藏服务器的方法中的错误吗?

1 个答案:

答案 0 :(得分:0)

Tor的隐藏服务“.onion”名称不是实际的互联网主机名,并且无法通过普通的DNS名称解析系统转换为IP地址,因为Tor隐藏服务器没有(已知)普通IP地址;只有使用Tor软件才能通过整个Tor多跳匿名化网络流程才能安全地访问它们。当您尝试使用上面的代码连接到“mysite.onion”时,它将转到系统配置的DNS服务并要求其提供与“mysite.onion”对应的IP地址,并且正确告知互联网上没有此类地址。如果您尝试使用没有安装Tor软件的普通非Tor Web浏览器访问mysite.onion,则会遇到同样的问题。

如果你安装了标准的Tor浏览器软件包,那么你需要注意的事情之一就是配置它的嵌入式Firefox副本来截取你输入的URL并查找.onion后缀,然后通过它来路由这些连接尝试。 Tor网络而不是使用普通的直接互联网。但是,如果您想编写自己的应用程序,其连接将不会通过预配置的浏览器,那么这显然不会有任何好处。要在您自己的应用程序中使用.onion地址,而不是尝试直接连接到mysite.onion,您需要连接到Tor软件的内置SOCKS代理服务器功能,该功能充当中介以接收针对Tor的消息。洋葱URL并将它们通过Tor网络传递给隐藏服务器,然后将响应传递回您的应用程序。

添加:假设您的计算机上安装了Internet Explorer,可以告诉WinINet(提供上述调用的库)使用SOCKS代理连接。请注意,您根本不必实际运行Internet Explorer,但安装它会使用包含SOCKS功能的改进版本升级默认Windows WinINet库。当然,现在几乎所有版本的Windows都预装了IE,所以它可能不是问题。

要告诉WinINet使用SOCKS,请将InternetOpen调用更改为(假设默认的Tor SOCKS端口号):

h = InternetOpen(USER_AGENT, INTERNET_OPEN_TYPE_PROXY, "SOCKS=localhost:9050", NULL, 0);

然而,有可能出现并发症(当然!),我自己也没有实际使用过。有多个版本的SOCKS协议正在使用中(通常是4,4a和5),我不确定Tor和IE究竟支持哪个版本,或者WinINet在协商找到一个共同点时的表现如何。

如果SOCKS不起作用,WinINet还包括使用HTTP代理的能力(与SOCKS相同的目的,只是一个不同的协议来告诉它连接到谁)。但是,由于Tor本身并不了解HTTP代理连接,因此您必须添加另一个中间软件层来处理HTTP代理请求和Tor的SOCKS支持之间的转换。幸运的是,有适用于Windows的优秀免费HTTP代理处理程序,最好的可能是Privoxy,这是often used with Tor,因为它还添加了一些关键的安全功能,例如仔细清理HTTP请求标头以确保它们不会' t泄漏任何识别信息到Tor隐藏服务器,如果这是一个问题(即使你信任Tor服务器的管理员,他们的服务器可能会被发现并在某一天被占用并且所有流量都被记录)。

要告诉WinINet使用HTTP代理,请使用(使用默认的Privoxy端口号):

h = InternetOpen(USER_AGENT, INTERNET_OPEN_TYPE_PROXY, "http=http://localhost:8118", NULL, 0);

你应该开始运作。