Як я можу підключитися до прихованої служби Tor за допомогою CURL в PHP?


366

Я намагаюся підключитися до Tor прихованої служби за допомогою наступного 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).

Я вважаю, що причина роботи з командного рядка полягає в тому, що Tor (проксі) вирішує ім'я хоста .onion, яке він розпізнає. Під час використання коду PHP вище, я здогадуюсь, що cURL або PHP намагаються вирішити ім'я хоста .onion і не розпізнає його. Я шукав спосіб сказати cURL / PHP, щоб дозволити проксі вирішити ім'я хоста, але я не можу знайти спосіб.

Існує дуже схоже запитання щодо переповнення стека, запит CURL з використанням проксі socks5 не працює при використанні PHP, але він працює через командний рядок .

Відповіді:



21

Я використовую Privoxy та CURL для того, щоб скребти сторінки 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);
?>

Після встановлення Privoxy потрібно додати цей рядок до файлу конфігурації ( /etc/privoxy/config). Зверніть увагу на пробіл та "." кінець рядка.

forward-socks4a / localhost:9050 .

Потім перезапустіть Privoxy.

/etc/init.d/privoxy restart

Це працює! Тестовано для Windows 10 і CentOS 6, також якщо Tor використовує Socks 5 замість Socks 4, використовуйте це:forward-socks5 / localhost:9150 .
David Refoua

чи потрібні мені TOR і Privoxy для того, щоб це працювало? дякую
AMB


5

TL; DR: встановлено CURLOPT_PROXYTYPEдля використання, CURLPROXY_SOCKS5_HOSTNAMEякщо у вас сучасний PHP, значення в 7іншому випадку та / або виправити CURLOPT_PROXYзначення.

Як ви правильно зробили, ви не можете розв’язати .onionдомени за допомогою звичайної системи DNS, оскільки це зарезервований домен верхнього рівня, спеціально для використання Tor, і такі домени за дизайном не мають IP-адрес для відображення.

Використання CURLPROXY_SOCKS5призведе команду cURL для надсилання трафіку на проксі, але не зробить те ж саме для дозволу доменного імені. Запити DNS, що надходять до спроб CURL встановити фактичне з'єднання з сайтом Onion, все одно будуть надсилатися до звичайного DNS-розв’язувача системи. Ці запити DNS, безумовно, не зможуть, тому що звичайний DNS-вирішальник системи не буде знати, що робити з .onionадресою, якщо він теж спеціально не пересилає такі запити Tor.

Замість цього CURLPROXY_SOCKS5потрібно використовувати CURLPROXY_SOCKS5_HOSTNAME. Як варіант, ви також можете використовувати CURLPROXY_SOCKS4A, але SOCKS5 є набагато кращим. Будь-який із цих типів проксі повідомляє CURL про виконання як своїх DNS-запитів, так і фактичної передачі даних через проксі. Це потрібно для успішного вирішення будь-якого .onionдомену.

У коді є ще дві додаткові помилки в початковому запитанні, які ще повинні бути виправлені попередніми коментаторами. Це:

  • Пропущена крапка з комою в кінці рядка 1.
  • Значення адреси проксі-сервера встановлено на URL-адресу HTTP, але його тип - SOCKS; вони несумісні. Для проксі-серверів SOCKS значення повинно бути комбінацією IP або домену та номера порту без схеми / протоколу / префікса.

Ось правильний код у повному обсязі, із коментарями, які вказують на зміни.

<?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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.