如何在PHP中使用cURL连接到Tor隐藏服务?

如何在PHP中使用cURL连接到Tor隐藏服务?,php,curl,proxy,tor,Php,Curl,Proxy,Tor,我正在尝试使用以下PHP代码连接到Tor隐藏服务: $url = 'http://jhiwjjlqpyawmpjx.onion/' $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_PROXY, "http://127.0.0.1:9050/"); curl_setopt

我正在尝试使用以下PHP代码连接到Tor隐藏服务:

$url = 'http://jhiwjjlqpyawmpjx.onion/'
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_PROXY, "http://127.0.0.1:9050/");
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
$output = curl_exec($ch);
$curl_error = curl_error($ch);
curl_close($ch);

print_r($output);
print_r($curl_error);
当我运行它时,会出现以下错误:

无法解析主机名

但是,当我在Ubuntu的命令行中运行以下命令时:

curl -v --socks5-hostname localhost:9050 http://jhiwjjlqpyawmpjx.onion
我得到了预期的回应

PHP文档中说:

--socks5-hostname
Use  the  specified  SOCKS5 proxy (and let the proxy resolve the host name).
我相信它从命令行工作的原因是因为代理正在解析它可以识别的.onion主机名。当运行上面的PHP代码时,我猜cURL或PHP正在尝试解析.onion主机名,但无法识别它。我已经寻找了一种方法,告诉cURL/PHP让代理解析主机名,但是我找不到一种方法

还有一个非常类似的堆栈溢出问题。

尝试添加以下内容:

curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); 
我使用和卷曲来刮纸:

<?php
    $ch = curl_init('http://jhiwjjlqpyawmpjx.onion'); // Tormail URL
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
    curl_setopt($ch, CURLOPT_PROXY, "localhost:8118"); // Default privoxy port
    curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
    curl_exec($ch);
    curl_close($ch);
?>
然后重启Privoxy

/etc/init.d/privoxy restart
您需要将选项CURLOPT_PROXYTYPE设置为,这很遗憾;如果在中前面有,但可以显式使用其值,该值等于7:

TL;DR:如果您使用的是现代PHP,请将CURLOPT_PROXYTYPE设置为使用CURLPROXY_SOCKS5_主机名,否则设置为7,和/或更正CURLOPT_代理值

正如您正确推断的那样,您无法通过正常的DNS系统解析.onion域,因为这是一个,而且此类域在设计上没有IP地址可映射

使用CURLPROXY_SOCKS5将指示cURL命令将其流量发送到代理,但不会对域名解析执行相同的操作。在cURL尝试与洋葱站点建立实际连接之前发出的DNS请求仍将发送到系统的正常DNS解析程序。这些DNS请求肯定会失败,因为系统的正常DNS解析器将不知道如何处理.onion地址,除非它也专门将此类查询转发给Tor

您必须使用,而不是卷发袜5。或者,您也可以使用SOCKS4A,但SOCKS5更受欢迎。这两种代理类型中的任何一种都会通知cURL执行DNS查找和通过代理进行的实际数据传输。这是成功解析任何.onion域所必需的

原始问题中的代码中还有两个附加错误,之前的评论者尚未纠正。这些是:

第1行末尾缺少分号。 代理地址值设置为HTTP URL,但其类型为SOCKS;这些是不相容的。对于SOCKS代理,该值必须是IP或域名和端口号的组合,不带方案/协议/前缀。 下面是完整的正确代码,带有注释以指示更改


这管用!在Windows 10和CentOS 6上测试,如果Tor使用Socks 5而不是Socks 4,请使用以下选项:forward-Socks 5/localhost:9150。我是否需要Tor和Privoxy两者才能工作?谢谢
/etc/init.d/privoxy restart
curl_setopt($ch, CURLOPT_PROXYTYPE, 7);