PHP'de cURL kullanarak bir Tor gizli hizmetine nasıl bağlanabilirim?


366

Aşağıdaki PHP kodunu kullanarak Tor gizli bir hizmete bağlanmaya çalışıyorum:

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

Çalıştırdığımda, aşağıdaki hatayı alıyorum:

Ana bilgisayar adı çözülemedi

Ancak, Ubuntu'daki komut satırımdan aşağıdaki komutu çalıştırdığımda:

curl -v --socks5-hostname localhost:9050 http://jhiwjjlqpyawmpjx.onion

Beklendiği gibi bir yanıt alıyorum

PHP cURL belgeleri şöyle diyor:

--socks5-hostname
Use  the  specified  SOCKS5 proxy (and let the proxy resolve the host name).

Komut satırından çalışmasının nedeninin Tor'un (proxy) tanıdığı .onion ana bilgisayar adını çözmesi nedeniyle olduğuna inanıyorum. Yukarıdaki PHP kodunu çalıştırırken, tahminim cURL veya PHP'nin .onion ana bilgisayar adını çözmeye çalıştığı ve tanımıyor olmasıdır. Proxy ana bilgisayar adını çözmek için cURL / PHP anlatmak için bir yol aradım, ama bir yol bulamıyorum.

Çok benzer bir Stack Overflow sorusu var, PHP kullanırken socks5 proxy kullanan cURL isteği başarısız oluyor, ancak komut satırı üzerinden çalışıyor .

Yanıtlar:



21

Tor sayfalarını kazımak için Privoxy ve cURL kullanıyorum :

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

Privoxy'yi yükledikten sonra bu satırı yapılandırma dosyasına ( /etc/privoxy/config) eklemeniz gerekir . Alanı ve '.' satır sonu.

forward-socks4a / localhost:9050 .

Sonra Privoxy'yi yeniden başlatın.

/etc/init.d/privoxy restart

Bu çalışıyor! Hem Windows 10 hem de CentOS 6'da test edilmiştir, ayrıca Tor Socks 4 yerine Socks 5 kullanıyorsa, bunu kullanın:forward-socks5 / localhost:9150 .
David Refoua

bunun için TOR ve Privoxy'ye ihtiyacım var mı? teşekkürler
AM


5

TL; DR: Set CURLOPT_PROXYTYPEkullanmak CURLPROXY_SOCKS5_HOSTNAMEEğer, değer modern PHP varsa 7aksi takdirde ve / veya düzeltmek CURLOPT_PROXYdeğeri.

Doğru şekilde çıkardığınız gibi, .onionalan adlarını normal DNS sistemi aracılığıyla çözemezsiniz , çünkü bu özellikle Tor tarafından kullanılmak üzere ayrılmış bir üst düzey alan adıdır ve tasarım tarafından bu tür alan adlarının eşlenecek IP adresleri yoktur.

Kullanma CURLPROXY_SOCKS5vekil olan trafik göndermek için cURL komutunu yönlendirecektir, ancak değil alan adı çözümlemesi için aynı şeyi. CURL, Soğan sitesiyle gerçek bağlantı kurmaya çalışmadan önce gönderilen DNS istekleri yine de sistemin normal DNS çözümleyicisine gönderilir. Bu DNS istekleri kesinlikle başarısız olacaktır, çünkü sistemin normal DNS çözümleyicisi bu .oniontür sorguları özellikle Tor'a yönlendirmedikçe bir adresle ne yapacağını bilemez .

Bunun yerine, CURLPROXY_SOCKS5kullanmalısınız CURLPROXY_SOCKS5_HOSTNAME. Alternatif olarak, kullanabilirsiniz CURLPROXY_SOCKS4A, ancak SOCKS5 çok tercih edilir. Bu proxy türlerinden her ikisi de cURL'ye hem DNS aramalarını hem de proxy üzerinden gerçek veri aktarımını gerçekleştirmesini bildirir. Herhangi bir .onionalanı başarıyla çözmek için bu gereklidir .

Orijinal sorudaki kodda, önceki yorumcular tarafından henüz düzeltilmemiş olan iki ek hata daha vardır. Bunlar:

  • Satır 1'in sonunda noktalı virgül eksik.
  • Proxy adresi değeri bir HTTP URL'sine ayarlanmış, ancak türü SOCKS; bunlar uyumsuz. SOCKS proxy'leri için değer, şema / protokol / önek olmadan bir IP veya etki alanı adı ve bağlantı noktası numarası birleşimi olmalıdır.

İşte tam olarak doğru kod, değişiklikleri gösteren yorumlar.

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

Ayrıca , öneki içerecek şekilde değeri CURLOPT_PROXYTYPEdeğiştirerek ayarı tamamen atlayabilirsiniz :CURLOPT_PROXYsocks5h://

// Note no trailing slash, as this is a SOCKS address, not an HTTP URL.
curl_setopt(CURLOPT_PROXY, 'socks5h://127.0.0.1:9050');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.