복붙노트

PHP ini file_get_contents 외부 URL

PHP

PHP ini file_get_contents 외부 URL

나는 다음과 같은 PHP 함수를 사용한다 :

file_get_contents ( 'http://example.com');

특정 서버에서이 작업을 수행 할 때마다 결과가 비어 있습니다. 내가 다른 곳에서 그것을 할 때 결과는 페이지의 내용이 무엇이든간에 가능합니다. 그러나 결과가 비어있는 서버에서 외부 URL (file_get_contents ( '../ simple / internal / path.html');)에 액세스하지 않고 로컬로 함수를 사용하면 작동합니다.

이제는 특정 php.ini 구성과 관련이 있다는 것을 확신합니다. 그러나 내가 확신 할 수없는 것은 어느 것인가. 도와주세요.

해결법

  1. ==============================

    1.찾으려는 설정은 allow_url_fopen입니다.

    찾으려는 설정은 allow_url_fopen입니다.

    php.ini 파일을 변경하지 않고 두 가지 방법으로 접근 할 수 있습니다. 하나는 fsockopen ()을 사용하고 다른 하나는 cURL을 사용하는 것입니다.

    어쨌든 file_get_contents ()보다 cURL을 사용하는 것이 좋습니다.

  2. ==============================

    2.Aillyn의 답변을 보완하기 위해 file_get_contents의 동작을 모방하기 위해 아래와 같은 함수를 사용할 수 있습니다.

    Aillyn의 답변을 보완하기 위해 file_get_contents의 동작을 모방하기 위해 아래와 같은 함수를 사용할 수 있습니다.

    function get_content($URL){
          $ch = curl_init();
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
          curl_setopt($ch, CURLOPT_URL, $URL);
          $data = curl_exec($ch);
          curl_close($ch);
          return $data;
    }
    
    echo get_content('http://example.com');
    
  3. ==============================

    3.는 ini 구성 설정 인 allow_url_fopen과 관련이 있습니다.

    는 ini 구성 설정 인 allow_url_fopen과 관련이 있습니다.

    이 옵션을 사용하면 코드의 일부 버그가 악용 될 수 있음을 알고 있어야합니다.

    예를 들어, 입력을 검증하지 못하면 완전한 원격 코드 실행 취약점이 될 수 있습니다.

    copy($_GET["file"], "."); 
    
  4. ==============================

    4.

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://www.your_external_website.com");
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $result = curl_exec($ch);
    curl_close($ch);
    

    http url에 가장 적합합니다. 하지만 https URL을 열면 어떻게 도움이됩니까?

  5. ==============================

    5.이것은 외부 링크에 php.ini를 사용할 필요없이 절대 경로를 제공합니다.

    이것은 외부 링크에 php.ini를 사용할 필요없이 절대 경로를 제공합니다.

    <?php
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://www.your_external_website.com");
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $result = curl_exec($ch);
    curl_close($ch);
    $result = preg_replace("#(<\s*a\s+[^>]*href\s*=\s*[\"'])(?!http)([^\"'>]+)([\"'>]+)#",'$1http://www.your_external_website.com/$2$3', $result);
    echo $result
    ?>
    
  6. ==============================

    6.위에 제공된 대답은 문제를 해결하지만 OP가 묘사 한 이상한 행동을 설명하지는 않습니다. 이 설명은이 사이트가 모두 동일한 호스트 (및 동일한 가상 호스트, 아파치 2.4 및 php7.0을 사용하고 있습니다)에있는 개발 환경에서 사이트 간의 통신을 테스트하는 데 도움이됩니다.

    위에 제공된 대답은 문제를 해결하지만 OP가 묘사 한 이상한 행동을 설명하지는 않습니다. 이 설명은이 사이트가 모두 동일한 호스트 (및 동일한 가상 호스트, 아파치 2.4 및 php7.0을 사용하고 있습니다)에있는 개발 환경에서 사이트 간의 통신을 테스트하는 데 도움이됩니다.

    필자가 만났던 file_get_contents ()의 미묘한 점은 여기에 절대적으로 관련이 있지만 해결되지 않았기 때문입니다 (아마 찾을 수없는 막연한 PHP 보안 모델 백서에 설명되어 있거나 문서화되지 않았기 때문에 간신히 문서화되었거나 문서화되지 않았기 때문일 수 있습니다).

    모든 관련 컨텍스트에서 allow_url_fopen을 Off로 설정하면 (예 : /etc/php/7.0/apache2/php.ini, /etc/php/7.0/fpm/php.ini 등) 명령에서 allow_url_fopen이 On으로 설정됩니다 (즉, /etc/php/7.0/cli/php.ini), 로컬 리소스에 대한 file_get_contents ()에 대한 호출이 허용되며 다음과 같이 경고가 기록되지 않습니다 :

    file_get_contents('php://input');
    

    또는

    // Path outside document root that webserver user agent has permission to read. e.g. for an apache2 webserver this user agent might be www-data so a file at /etc/php/7.0/filetoaccess would be successfully read if www-data had permission to read this file
    file_get_contents('<file path to file on local machine user agent can access>');
    

    또는

    // Relative path in same document root
    file_get_contents('data/filename.dat')
    

    결론적으로 allow_url_fopen = Off 제한은 OUTPUT 체인의 iptables 규칙과 유사합니다. 여기서 "시스템 종료"또는 "컨텍스트 변경"시도가있을 때만 제한이 적용됩니다.

    N.B. 커맨드 라인 컨텍스트 (예 : /etc/php/7.0/cli/php.ini)에서 allow_url_fopen을 On으로 설정하면 내 시스템에있는 것이지만 설정 한 경우에도 설명에 아무런 영향을 미치지 않을 것으로 생각됩니다 물론 명령 줄 자체에서 스크립트를 실행하여 테스트하지 않는 한 해제하십시오. 명령 줄 컨텍스트에서 allow_url_fopen을 Off로 설정하여 동작을 테스트하지 않았습니다.

  7. ==============================

    7.더하다:

    더하다:

    allow_url_fopen=1
    

    php.ini 파일에서. 공유 호스팅을 사용하는 경우 먼저 공유 호스팅을 만듭니다.

  8. from https://stackoverflow.com/questions/3488425/php-ini-file-get-contents-external-url by cc-by-sa and MIT license