Làm cách nào tôi có thể kết nối với dịch vụ ẩn Tor bằng cURL trong PHP?


366

Tôi đang cố gắng kết nối với dịch vụ ẩn Tor bằng mã PHP sau:

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

Khi tôi chạy nó, tôi gặp lỗi sau:

Không thể giải quyết tên máy chủ

Tuy nhiên, khi tôi chạy lệnh sau từ dòng lệnh của mình trong Ubuntu:

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

Tôi nhận được phản hồi như mong đợi

Các tài liệu cURL PHP nói điều này:

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

Tôi tin rằng lý do nó hoạt động từ dòng lệnh là vì Tor (proxy) đang giải quyết tên máy chủ .onion mà nó nhận ra. Khi chạy mã PHP ở trên, tôi đoán là cURL hoặc PHP đang cố gắng giải quyết tên máy chủ .onion và không nhận ra nó. Tôi đã tìm kiếm một cách để nói với cURL / PHP để cho phép proxy giải quyết tên máy chủ, nhưng tôi không thể tìm ra cách nào.

Có một câu hỏi Stack Overflow rất giống nhau, yêu cầu cURL sử dụng proxy vớ5 không thành công khi sử dụng PHP, nhưng nó hoạt động thông qua dòng lệnh .

Câu trả lời:



21

Tôi sử dụng Privoxy và cURL để quét các trang 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);
?>

Sau khi cài đặt Privoxy, bạn cần thêm dòng này vào tệp cấu hình ( /etc/privoxy/config). Lưu ý không gian và '.' cuối dòng

forward-socks4a / localhost:9050 .

Sau đó khởi động lại Privoxy.

/etc/init.d/privoxy restart

Những công việc này! Đã thử nghiệm trên cả Windows 10 và CentOS 6, nếu Tor sử dụng Vớ 5 thay vì Vớ 4, hãy sử dụng cách này:forward-socks5 / localhost:9150 .
David Refoua

Tôi có cần TOR và Privoxy cho việc này không? cảm ơn

8

Hãy thử thêm điều này:

curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); 

5

TL; DR: Đặt CURLOPT_PROXYTYPEđể sử dụng CURLPROXY_SOCKS5_HOSTNAMEnếu bạn có PHP hiện đại, 7nếu không thì giá trị và / hoặc sửa CURLOPT_PROXYgiá trị.

Như bạn đã suy luận chính xác, bạn không thể giải quyết .onioncác tên miền thông qua hệ thống DNS thông thường, vì đây là miền cấp cao nhất dành riêng cho Tor sử dụng và các tên miền như vậy theo thiết kế không có địa chỉ IP để ánh xạ.

Việc sử dụng CURLPROXY_SOCKS5sẽ chỉ đạo lệnh cURL để gửi lưu lượng của nó đến proxy, nhưng sẽ không làm như vậy đối với độ phân giải tên miền. Các yêu cầu DNS, được phát ra trước khi cURL cố gắng thiết lập kết nối thực tế với trang Onion, vẫn sẽ được gửi đến trình phân giải DNS thông thường của hệ thống. Các yêu cầu DNS này chắc chắn sẽ thất bại, vì trình phân giải DNS thông thường của hệ thống sẽ không biết phải làm gì với một .onionđịa chỉ trừ khi nó cũng chuyển tiếp các truy vấn như vậy đến Tor.

Thay vì CURLPROXY_SOCKS5, bạn phải sử dụng CURLPROXY_SOCKS5_HOSTNAME. Ngoài ra, bạn cũng có thể sử dụng CURLPROXY_SOCKS4A, nhưng SOCKS5 được ưa thích hơn nhiều. Một trong hai loại proxy này thông báo cho cURL thực hiện cả tra cứu DNS và truyền dữ liệu thực tế của nó thông qua proxy. Điều này là cần thiết để giải quyết thành công bất kỳ .oniontên miền.

Ngoài ra còn có hai lỗi bổ sung trong mã trong câu hỏi ban đầu vẫn chưa được sửa bởi những người bình luận trước đó. Đó là:

  • Thiếu dấu chấm phẩy ở cuối dòng 1.
  • Giá trị địa chỉ proxy được đặt thành URL HTTP, nhưng loại của nó là SOCKS; những cái này không tương thích Đối với proxy SOCKS, giá trị phải là kết hợp IP hoặc tên miền và số cổng mà không có lược đồ / giao thức / tiền tố.

Dưới đây là mã chính xác đầy đủ, với các bình luận để chỉ ra những thay đổi.

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

Bạn cũng có thể bỏ CURLOPT_PROXYTYPEhoàn toàn cài đặt bằng cách thay đổi CURLOPT_PROXYgiá trị để bao gồm socks5h://tiền tố:

// Note no trailing slash, as this is a SOCKS address, not an HTTP URL.
curl_setopt(CURLOPT_PROXY, 'socks5h://127.0.0.1:9050');
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.