PHP에서 cURL을 사용하여 Tor 숨김 서비스에 연결하려면 어떻게해야합니까?


366

다음 PHP 코드를 사용하여 Tor 숨겨진 서비스에 연결하려고합니다.

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

실행할 때 다음 오류가 발생합니다.

호스트 이름을 확인할 수 없습니다

그러나 우분투의 명령 줄에서 다음 명령을 실행할 때 :

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에 알리는 방법을 찾았지만 방법을 찾을 수 없습니다.

매우 유사한 스택 오버플로 질문이 있습니다. socks5 프록시를 사용한 cURL 요청은 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

작동합니다! Tor가 Socks 4 대신 Socks 5를 사용하는 경우 Windows 10 및 CentOS 6 모두에서 테스트되었습니다.forward-socks5 / localhost:9150 .
David Refoua

이것이 작동하려면 TOR과 Privoxy가 모두 필요합니까? 감사합니다
AMB


5

TL; DR : 최신 PHP CURLOPT_PROXYTYPE를 사용하는 CURLPROXY_SOCKS5_HOSTNAME경우 사용 하고, 7그렇지 않으면 CURLOPT_PROXY값을 수정하거나 수정하십시오 .

올바르게 추론 한 .onion경우 일반 DNS 시스템을 통해 도메인을 확인할 수 없습니다. 이 도메인은 Tor에서 사용하도록 특별히 예약 된 최상위 도메인이며 설계 상 이러한 도메인에는 매핑 할 IP 주소가 없기 때문입니다.

를 사용 CURLPROXY_SOCKS5하면 cURL 명령이 트래픽을 프록시로 보내도록 지시하지만 도메인 이름 확인에는 동일하지 않습니다 . cURL이 Onion 사이트와의 실제 연결을 설정 하기 전에 생성 된 DNS 요청 은 여전히 ​​시스템의 일반 DNS 해석기로 전송됩니다. 이러한 DNS 요청은 시스템의 일반적인 DNS 확인자가 .onion주소 를 어떻게 처리해야하는지 알 수 없기 때문에 반드시 실패 할 것 입니다. 또한 이러한 쿼리는 Tor에 구체적으로 전달되지 않습니다.

대신을 CURLPROXY_SOCKS5사용해야합니다 CURLPROXY_SOCKS5_HOSTNAME. 또는을 사용할 수도 CURLPROXY_SOCKS4A있지만 SOCKS5가 훨씬 선호됩니다. 이 프록시 유형 중 하나는 cURL에 DNS 조회와 프록시를 통한 실제 데이터 전송을 모두 수행하도록 지시합니다. 이것은 모든 .onion도메인 을 성공적으로 해결하는 데 필요 합니다.

원래 질문의 코드에는 이전 주석 작성자가 아직 수정하지 않은 두 가지 추가 오류가 있습니다. 이것들은:

  • 라인 1 끝에 세미콜론이 없습니다.
  • 프록시 주소 값은 HTTP URL로 설정되지만 유형은 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_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');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.