次の 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).
コマンドラインから動作するのは、Tor (プロキシ) が .onion ホスト名を解決し、それを認識しているからだと思います。上記の PHP コードを実行すると、cURL または PHP が .onion ホスト名を解決しようとしますが、認識されないのではないかと思います。cURL/PHP にプロキシにホスト名を解決させる方法を探しましたが、方法が見つかりません。
Stack Overflowに非常に似た質問があります。PHP を使用すると socks5 プロキシを使用した cURL リクエストが失敗しますが、コマンドラインでは機能します。。
ベストアンサー1
CURLOPT_PROXYTYPE
オプションを設定する必要がありますCURLPROXY_SOCKS5_HOSTNAME
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME);
CURLPROXY_SOCKS5_HOSTNAME
定義されるPHP 5.6.10以降古いバージョンを使用している場合は、その値を明示的に使用できます7
。
curl_setopt($ch, CURLOPT_PROXYTYPE, 7);