Bagaimana saya bisa terhubung ke layanan tersembunyi Tor menggunakan cURL di PHP?

366

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 .

sangat dingin
sumber

Jawaban:

21

Saya menggunakan Privoxy dan cURL untuk mengikis halaman 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);
?>

Setelah menginstal Privoxy Anda perlu menambahkan baris ini ke file konfigurasi ( /etc/privoxy/config). Perhatikan spasi dan '.' akhir dari garis.

forward-socks4a / localhost:9050 .

Kemudian restart Privoxy.

/etc/init.d/privoxy restart
Kentang Lemak
sumber
Ini bekerja! Diuji pada Windows 10 dan CentOS 6, juga jika Tor menggunakan Socks 5 alih-alih Socks 4, gunakan ini:forward-socks5 / localhost:9150 .
David Refoua
apakah saya memerlukan TOR dan Privoxy agar ini berfungsi? terima kasih
8

Coba tambahkan ini:

curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); 
Anthony Garcia-Labiad
sumber
5

TL; DR: Atur CURLOPT_PROXYTYPEuntuk digunakan CURLPROXY_SOCKS5_HOSTNAMEjika Anda memiliki PHP modern, nilainya 7sebaliknya, dan / atau koreksi CURLOPT_PROXYnilainya.

Ketika Anda menyimpulkan dengan benar, Anda tidak dapat menyelesaikan .oniondomain 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_SOCKS5akan 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 .onionalamat kecuali jika itu juga, secara khusus meneruskan pertanyaan seperti itu ke Tor.

Alih-alih CURLPROXY_SOCKS5, Anda harus menggunakan CURLPROXY_SOCKS5_HOSTNAME. Atau, Anda juga dapat menggunakan CURLPROXY_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 .oniondomain apa pun .

Ada juga dua kesalahan tambahan dalam kode dalam pertanyaan awal yang belum diperbaiki oleh komentator sebelumnya. Ini adalah:

  • Titik koma tidak ada di akhir baris 1.
  • Nilai alamat proxy diatur ke URL HTTP, tetapi tipenya adalah SOCKS; ini tidak kompatibel. Untuk proxy SOCKS, nilainya harus berupa IP atau kombinasi nama domain dan nomor port tanpa skema / protokol / awalan.

Ini adalah kode yang benar secara penuh, dengan komentar untuk mengindikasikan perubahan.

<?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);

Anda juga dapat menghilangkan pengaturan CURLOPT_PROXYTYPEsepenuhnya dengan mengubah CURLOPT_PROXYnilai untuk menyertakan socks5h://awalan:

// Note no trailing slash, as this is a SOCKS address, not an HTTP URL.
curl_setopt(CURLOPT_PROXY, 'socks5h://127.0.0.1:9050');
Meitar
sumber