次の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 cURLドキュメントはこれを言います:
--socks5-hostname
Use the specified SOCKS5 proxy (and let the proxy resolve the host name).
コマンドラインから機能する理由は、Tor(プロキシ)が認識している.onionホスト名を解決しているためだと思います。上記のPHPコードを実行すると、cURLまたはPHPが.onionホスト名を解決しようとし、それを認識しないと思います。プロキシにホスト名を解決させるようにcURL / PHPに指示する方法を探しましたが、方法が見つかりません。
非常によく似たスタックオーバーフローの質問があります。PHPを使用するとsocks5プロキシを使用したcURLリクエストが失敗しますが、コマンドラインを介して機能します。
forward-socks5 / localhost:9150 .