Saya mencoba menyambung ke layanan tersembunyi Tor menggunakan kode PHP berikut:
$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);
Ketika saya menjalankannya, saya mendapatkan kesalahan berikut:
Tidak dapat menyelesaikan nama host
Namun, ketika saya menjalankan perintah berikut dari baris perintah saya di Ubuntu:
curl -v --socks5-hostname localhost:9050 http://jhiwjjlqpyawmpjx.onion
Saya mendapat respons seperti yang diharapkan
Dokumentasi PHP cURL mengatakan ini:
--socks5-hostname
Use the specified SOCKS5 proxy (and let the proxy resolve the host name).
Saya percaya alasan kerjanya dari baris perintah adalah karena Tor (proxy) sedang menyelesaikan nama host .onion, yang dikenali. Saat menjalankan kode PHP di atas, tebakan saya adalah bahwa cURL atau PHP sedang mencoba untuk menyelesaikan nama host .onion dan tidak mengenalinya. Saya telah mencari cara untuk memberitahu cURL / PHP untuk membiarkan proxy menyelesaikan nama host, tetapi saya tidak dapat menemukan cara.
Ada pertanyaan Stack Overflow yang sangat mirip, permintaan cURL menggunakan socks5 proxy gagal saat menggunakan PHP, tetapi ia bekerja melalui baris perintah .
forward-socks5 / localhost:9150 .
Coba tambahkan ini:
sumber
TL; DR: Atur
CURLOPT_PROXYTYPE
untuk digunakanCURLPROXY_SOCKS5_HOSTNAME
jika Anda memiliki PHP modern, nilainya7
sebaliknya, dan / atau koreksiCURLOPT_PROXY
nilainya.Ketika Anda menyimpulkan dengan benar, Anda tidak dapat menyelesaikan
.onion
domain melalui sistem DNS normal, karena ini adalah domain tingkat atas yang disediakan khusus untuk digunakan oleh Tor dan domain seperti itu menurut desain tidak memiliki alamat IP untuk dipetakan.Menggunakan
CURLPROXY_SOCKS5
akan mengarahkan perintah cURL untuk mengirim lalu lintas ke proxy, tetapi tidak akan melakukan hal yang sama untuk resolusi nama domain. Permintaan DNS, yang dikeluarkan sebelum cURL mencoba membuat koneksi aktual dengan situs Onion, masih akan dikirim ke resolver DNS normal sistem. Permintaan DNS ini pasti akan gagal, karena resolver DNS normal sistem tidak akan tahu apa yang harus dilakukan dengan.onion
alamat kecuali jika itu juga, secara khusus meneruskan pertanyaan seperti itu ke Tor.Alih-alih
CURLPROXY_SOCKS5
, Anda harus menggunakanCURLPROXY_SOCKS5_HOSTNAME
. Atau, Anda juga dapat menggunakanCURLPROXY_SOCKS4A
, tetapi SOCKS5 lebih disukai. Salah satu dari jenis proksi ini menginformasikan CURL untuk melakukan pencarian DNS dan transfer data aktualnya melalui proxy. Ini diperlukan untuk berhasil menyelesaikan.onion
domain apa pun .Ada juga dua kesalahan tambahan dalam kode dalam pertanyaan awal yang belum diperbaiki oleh komentator sebelumnya. Ini adalah:
Ini adalah kode yang benar secara penuh, dengan komentar untuk mengindikasikan perubahan.
Anda juga dapat menghilangkan pengaturan
CURLOPT_PROXYTYPE
sepenuhnya dengan mengubahCURLOPT_PROXY
nilai untuk menyertakansocks5h://
awalan:sumber