मैं PHP में cURL का उपयोग कर एक टो छिपा सेवा से कैसे जुड़ सकता हूं?


366

मैं निम्नलिखित PHP कोड का उपयोग करके एक टो छिपी सेवा से कनेक्ट करने का प्रयास कर रहा हूं:

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

मेरा मानना ​​है कि यह कमांड लाइन से काम करने का कारण है क्योंकि टोर (प्रॉक्सी) .onion होस्टनाम को हल कर रहा है, जिसे वह पहचानता है। ऊपर दिए गए PHP कोड को चलाते समय, मेरा अनुमान है कि cURL या PHP .onion hostname को हल करने की कोशिश कर रहा है और इसे पहचानता नहीं है। मैंने CURL / PHP को बताने का तरीका खोजा है ताकि प्रॉक्सी होस्टनाम को हल कर सके, लेकिन मुझे कोई रास्ता नहीं मिल रहा है।

एक बहुत ही समान स्टैक ओवरफ्लो प्रश्न है, PHP का उपयोग करते समय मोजे 5 प्रॉक्सी विफल का उपयोग करते हुए cURL अनुरोध, लेकिन यह कमांड लाइन के माध्यम से काम करता है

जवाबों:


98

आप सेट विकल्प की जरूरत है CURLOPT_PROXYTYPEके लिए CURLPROXY_SOCKS5_HOSTNAMEहै, जो दुर्भाग्य से पुराने पीएचपी संस्करणों में परिभाषित नहीं किया गया था, लगभग पूर्व 5.6 ; यदि आपके पास पहले है, लेकिन आप स्पष्ट रूप से इसके मूल्य का उपयोग कर सकते हैं, जो इसके बराबर है 7:

curl_setopt($ch, CURLOPT_PROXYTYPE, 7);

21

मैं टोर पेजों को खंगालने के लिए प्रिविक्सी और CURL का उपयोग करता हूं :

<?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 स्थापित करने के बाद आपको कॉन्फ़िगरेशन फ़ाइल ( /etc/privoxy/config) में इस पंक्ति को जोड़ने की आवश्यकता है । अंतरिक्ष पर ध्यान दें और '।' पंक्ति का अंत।

forward-socks4a / localhost:9050 .

फिर Privoxy को पुनरारंभ करें।

/etc/init.d/privoxy restart

यह काम! Windows 10 और CentOS 6, दोनों पर परीक्षण किया गया, भले ही Tor Socks 4 के बजाय Socks 5 का उपयोग करता है, इसका उपयोग करें:forward-socks5 / localhost:9150 .
David Refoua

क्या मुझे काम करने के लिए TOR और Privoxy दोनों की ज़रूरत है? धन्यवाद
AMB


5

TL; DR: यदि आपके पास एक आधुनिक PHP है, तो मूल्य CURLOPT_PROXYTYPEका उपयोग करने के लिए सेट करें , और / या मूल्य को सही करें ।CURLPROXY_SOCKS5_HOSTNAME7CURLOPT_PROXY

जैसा कि आपने सही तरीके से घटाया है, आप .onionसामान्य DNS सिस्टम के माध्यम से डोमेन को हल नहीं कर सकते हैं , क्योंकि यह विशेष रूप से टोर द्वारा उपयोग के लिए एक आरक्षित शीर्ष-स्तरीय डोमेन है और डिजाइन द्वारा ऐसे डोमेन में मैप करने के लिए कोई आईपी पते नहीं हैं।

का उपयोग CURLPROXY_SOCKS5कर cURL कमांड को प्रॉक्सी पर अपना ट्रैफ़िक भेजने के लिए निर्देशित करेगा, लेकिन डोमेन नाम रिज़ॉल्यूशन के लिए ऐसा नहीं करेगा । DNS अनुरोध, जो कि ऑनर साइट के साथ वास्तविक संबंध स्थापित करने के लिए cURL प्रयासों से पहले उत्सर्जित होते हैं , को अभी भी सिस्टम के सामान्य DNS रिसॉल्वर के लिए भेजा जाएगा। ये DNS अनुरोध निश्चित रूप से विफल हो जाएंगे, क्योंकि सिस्टम के सामान्य DNS रिज़ॉल्वर को पता नहीं होगा कि किसी .onionपते के साथ क्या करना है, जब तक कि वह विशेष रूप से टॉर के लिए इस तरह के प्रश्नों को अग्रेषित नहीं कर रहा है।

इसके बजाय CURLPROXY_SOCKS5, आपको उपयोग करना चाहिए CURLPROXY_SOCKS5_HOSTNAME। वैकल्पिक रूप से, आप भी उपयोग कर सकते हैं CURLPROXY_SOCKS4A, लेकिन SOCKS5 ज्यादा पसंद किया जाता है। या तो ये प्रॉक्सी प्रकार अपने DNS लुकअप और प्रॉक्सी के माध्यम से वास्तविक डेटा ट्रांसफर दोनों करने के लिए cURL को सूचित करते हैं। किसी भी .onionडोमेन को सफलतापूर्वक हल करने के लिए यह आवश्यक है ।

मूल प्रश्न में कोड में दो अतिरिक्त त्रुटियां भी हैं, जिन्हें पिछले टिप्पणीकारों द्वारा ठीक किया जाना बाकी है। य़े हैं:

  • लाइन 1 के अंत में गुम अर्धविराम।
  • प्रॉक्सी पता मान HTTP URL पर सेट है, लेकिन इसका प्रकार SOCKS है; ये असंगत हैं। SOCKS परदे के पीछे, मान एक योजना या प्रोटोकॉल / उपसर्ग के बिना एक आईपी या डोमेन नाम और पोर्ट नंबर संयोजन होना चाहिए।

परिवर्तनों को इंगित करने के लिए टिप्पणियों के साथ पूर्ण में सही कोड है।

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

आप उपसर्ग को शामिल करने के CURLOPT_PROXYTYPEलिए CURLOPT_PROXYमान को बदलकर सेटिंग को पूरी तरह से छोड़ सकते हैं socks5h://:

// Note no trailing slash, as this is a SOCKS address, not an HTTP URL.
curl_setopt(CURLOPT_PROXY, 'socks5h://127.0.0.1:9050');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.