fro*_*sty 350 php proxy curl 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($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
$output = curl_exec($ch);
$curl_error = curl_error($ch);
curl_close($ch);
print_r($output);
print_r($curl_error);
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我收到以下错误:
无法解析主机名
但是,当我从Ubuntu中的命令行运行以下命令时:
curl -v --socks5-hostname localhost:9050 http://jhiwjjlqpyawmpjx.onion
Run Code Online (Sandbox Code Playgroud)
我得到了预期的回复
PHP cURL文档说明了这一点:
--socks5-hostname
Use the specified SOCKS5 proxy (and let the proxy resolve the host name).
Run Code Online (Sandbox Code Playgroud)
我相信它从命令行工作的原因是因为Tor(代理)正在解析它识别的.onion主机名.在运行上面的PHP代码时,我的猜测是cURL或PHP正在尝试解析.onion主机名并且无法识别它.我已经搜索了一种告诉cURL/PHP让代理解析主机名的方法,但我找不到办法.
有一个非常类似的Stack Overflow问题,使用socks5代理的cURL请求在使用PHP时失败,但它通过命令行工作.
dr.*_*cre 96
看起来CURLOPT_PROXYTYPE
没有在PHP中定义,但您可以显式使用其值,该值等于7:
curl_setopt($ch, CURLOPT_PROXYTYPE, 7);
Run Code Online (Sandbox Code Playgroud)
Fat*_*oes 20
我使用Privoxy和cURL来刮掉Tor页面:
<?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);
?>
Run Code Online (Sandbox Code Playgroud)
安装Privoxy后,您需要将此行添加到配置文件(/etc/privoxy/config
)中.注意空格和'.' 一行的结尾.
forward-socks4a / localhost:9050 .
Run Code Online (Sandbox Code Playgroud)
然后重启Privoxy.
/etc/init.d/privoxy restart
Run Code Online (Sandbox Code Playgroud)
尝试添加:
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
Run Code Online (Sandbox Code Playgroud)
TL;DR:如果您有现代 PHP,则设置CURLOPT_PROXYTYPE
为使用CURLPROXY_SOCKS5_HOSTNAME
,7
否则使用该值,和/或更正该CURLOPT_PROXY
值。
正如您正确推断的那样,您无法.onion
通过正常的 DNS 系统解析域,因为这是一个专门供 Tor 使用的保留顶级域,并且这些域的设计没有IP 地址可映射。
使用CURLPROXY_SOCKS5
将指示 cURL 命令将其流量发送到代理,但不会对域名解析执行相同操作。在cURL 尝试与 Onion 站点建立实际连接之前发出的 DNS 请求仍将发送到系统的正常 DNS 解析器。这些 DNS 请求肯定会失败,因为系统的普通 DNS 解析器不知道如何.onion
处理地址,除非它也专门将此类查询转发到 Tor。
取而代之的是CURLPROXY_SOCKS5
,您必须使用CURLPROXY_SOCKS5_HOSTNAME
. 或者,您也可以使用CURLPROXY_SOCKS4A
,但 SOCKS5 更受欢迎。这些代理类型中的任何一种都会通知 cURL 通过代理执行其 DNS 查找和实际数据传输。这是成功解析任何.onion
域所必需的。
原始问题中的代码中还有两个额外的错误尚未被之前的评论者更正。这些是:
这是完整的正确代码,并附有注释以指示更改。
<?php
$url = 'http://jhiwjjlqpyawmpjx.onion/'; // Note the addition of a semicolon.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1:9050"); // Note the address here is just `IP:port`, not an HTTP URL.
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME); // Note use of `CURLPROXY_SOCKS5_HOSTNAME`.
$output = curl_exec($ch);
$curl_error = curl_error($ch);
curl_close($ch);
print_r($output);
print_r($curl_error);
Run Code Online (Sandbox Code Playgroud)
您还可以CURLOPT_PROXYTYPE
通过更改CURLOPT_PROXY
值以包含socks5h://
前缀来完全省略设置:
// Note no trailing slash, as this is a SOCKS address, not an HTTP URL.
curl_setopt(CURLOPT_PROXY, 'socks5h://127.0.0.1:9050');
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
233865 次 |
最近记录: |