source

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

factcode 2022. 10. 3. 17:32
반응형

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

다음 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);

실행 시 다음 오류가 나타납니다.

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

그러나 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에 지시하는 방법을 찾아봤지만 방법을 찾을 수 없습니다.

Stack Overflow와 매우 유사한 질문이 있습니다. PHP를 사용할 때 socks5 프록시를 사용한 cURL 요청은 실패하지만 명령줄통해 작동합니다.

옵션을 설정해야 합니다.CURLOPT_PROXYTYPE이전 PHP 버전에서는 정의되지 않은5.6 이전 버전입니다.이전 버전에서는 이 값을 명시적으로 사용할 수 있습니다.이 값은 다음과 같습니다.7:

curl_setopt($ch, CURLOPT_PROXYTYPE, 7);

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

다음을 추가해 보십시오.

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

TL;DR: 설정CURLOPT_PROXYTYPE사용하다CURLPROXY_SOCKS5_HOSTNAME최신 PHP를 가지고 있다면, 그 가치는7그렇지 않은 경우 및/또는 수정CURLOPT_PROXY가치.

올바르게 추리했으므로 해결할 수 없습니다..onion이는 Tor 전용으로 예약된 최상위 도메인이므로 매핑할 IP 주소가 없습니다.

사용.CURLPROXY_SOCKS5는 cURL 명령어로 트래픽을 프록시로 전송하도록 지시하지만 도메인 이름 해결에는 동일한 작업을 수행하지 않습니다.cURL이 Opion 사이트와의 실제 접속을 확립하기 전에 발신되는 DNS 요구는 시스템의 일반 DNS 리졸바에 송신됩니다.이러한 DNS 요구는 반드시 실패합니다. 왜냐하면 시스템의 일반 DNS 리졸바는 이 문제를 해결할 방법을 모르기 때문입니다..onionTor에게 이러한 쿼리를 전송하지 않는 한 대처합니다.

CURLPROXY_SOCKS5를 사용해야 합니다.또는 다음 명령어를 사용할 수도 있습니다.CURLPROXY_SOCKS4A, 선호됩니다.이러한 프록시 유형 중 하나는 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_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');

여기 간단한 기능이 있습니다.우선 fsocketopen()을 사용한 간단한 체크로 프록시가 유효한지 여부를 확인해야 합니다.

        try {
            $fp = fsockopen($ip, $port, $errno, $errstr, 10);
            fclose($fp);
            return true;
        } catch (\Throwable $th) {
            return false;
        }

소켓이 true를 반환하는 경우 requestUrl 함수를 사용합니다.

    private function requestUrl($url, $proxy)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_PROXY, $proxy);
        curl_setopt($curl, CURLOPT_HEADER, 1); 
        curl_setopt($curl, CURLOPT_HTTPPROXYTUNNEL, 1); 
        curl_setopt($curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        $contents = curl_exec($curl);
        //Check for errors.
        // if (curl_errno($curl)) {
        //     return new \Exception(curl_error($curl));
        // }
        curl_close($curl);
        return $contents;
    }

언급URL : https://stackoverflow.com/questions/15445285/how-can-i-connect-to-a-tor-hidden-service-using-curl-in-php

반응형