복붙노트

$ _SERVER [ 'HTTP_X_REQUESTED_WITH']이 (가) PHP에 있거나 없습니까?

PHP

$ _SERVER [ 'HTTP_X_REQUESTED_WITH']이 (가) PHP에 있거나 없습니까?

스택 오버플로에 여기에 포함 된 모든 인터넷상의 사람들은 요청이 AJAX인지 아닌지를 확인하는 좋은 방법은 다음을 수행하는 것이라고 말합니다.

if (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' ) {...}

그러나 공식 PHP 문서에 $ _SERVER [ 'HTTP_X_REQUESTED_WITH']가 표시되지 않습니다.

그리고 다음을 시도 할 때 :

echo $_SERVER['HTTP_X_REQUESTED_WITH'];

아무것도 출력되지 않습니다.

내가 뭔가 잘못하고 있는거야? 사용 가능한 경우 $ _SERVER [ 'HTTP_X_REQUESTED_WITH']를 사용하고 싶습니다.

해결법

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

    1.$ _SERVER의 변수는 PHP의 일부가 아니므로 PHP 설명서에서 찾을 수 없습니다. 스크립트 언어를 웹 서버에 전달하여 준비합니다.

    $ _SERVER의 변수는 PHP의 일부가 아니므로 PHP 설명서에서 찾을 수 없습니다. 스크립트 언어를 웹 서버에 전달하여 준비합니다.

    내가 아는 한, X-Requested-With는 대부분의 주요 프레임 워크의 Ajax 기능에 의해 보내지 만 전부는 아닙니다 (예 : Dojo는 2 년 전만해도 # 5801). 따라서 요청을 AJAX 요청인지 여부를 결정하는 것이 일반적으로 100 % 신뢰할 수있는 방법이 아니라고 말하는 것이 안전합니다.

    유일한 100 % 보안 방법은 요청과 함께 미리 정의 된 플래그 (예 : GET 변수)를 보내고 수신 페이지가 해당 플래그의 존재를 확인하는 것입니다.

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

    2.cURL을 사용하여 머리글을 쉽게 스푸핑 할 수 있다는 것을 잊지 마십시오.

    cURL을 사용하여 머리글을 쉽게 스푸핑 할 수 있다는 것을 잊지 마십시오.

    curl_setopt($ch,CURLOPT_HTTPHEADER,array("X-Requested-With : XMLHttpRequest"));
    
  3. ==============================

    3.HTTP_로 시작하는 $ _SERVER 키는 HTTP 요청 헤더에서 생성됩니다. 이 경우 X-Requested-With 헤더.

    HTTP_로 시작하는 $ _SERVER 키는 HTTP 요청 헤더에서 생성됩니다. 이 경우 X-Requested-With 헤더.

  4. ==============================

    4.이 헤더는 거기에있는 모든 AJAX 라이브러리의 표준화 진행 중입니다.

    이 헤더는 거기에있는 모든 AJAX 라이브러리의 표준화 진행 중입니다.

    이것은 PHP 문서에 설명되어있는 것이 아니라이 헤더를 설정하는 다른 AJAX 라이브러리에 있습니다. 공용 라이브러리는 jQuery, Mojo, Prototype 등의 헤더를 보낸다.

    보통이 라이브러리는 다음을 사용하여 헤더를 설정합니다.

    xhrobj.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    
  5. ==============================

    5.다음은 예제 사용법이있는 간단한 함수입니다.

    다음은 예제 사용법이있는 간단한 함수입니다.

    function isXmlHttpRequest()
    {
        $header = isset($_SERVER['HTTP_X_REQUESTED_WITH']) ? $_SERVER['HTTP_X_REQUESTED_WITH'] : null;
        return ($header === 'XMLHttpRequest');
    }
    
    // example - checking our active call
    if(!isXmlHttpRequest())
    {
        echo 'Not an ajax request';
    }
    else
    {
        echo 'is an ajax request';
    }
    
  6. ==============================

    6.

    echo $_SERVER['HTTP_X_REQUESTED_WITH'];
    

    그런 코드에서 당신은 무엇을 기대 했습니까? AJAX 요청을 사용하지 않고 브라우저에서 직접 실행한다고 가정합니다. 그렇다면이 헤더를 어떻게 설정할 수 있습니까?

    Well, Life, Universe 및 Everything에 대한 궁극적 인 질문에 대한 답변 - HTTP 스니퍼! 자신을 하나 얻고 $ _SERVER 변수를 출력하는 것을 잊어 버리십시오.

    Firebug에 Firebug가 있거나 Fiddler HTTP 프록시 또는 LiveHTTPHeaders Mozilla 플러그인을 사용할 수 있습니다. 나는 지루해 링크를 만들지 만 쉽게 봤습니다.

    따라서 HTTP 스니퍼로 모든 HTTP 헤더를 확신 할 수 있습니다.

    서버에 대한 모든 HTTP 요청은 이미 "직접"이므로 XHR을 사용하여 "직접 액세스"를 막을 수는 없습니다.

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

    7.일부 브라우저 버그를 비난 할 수도 있습니다.이 질문과 Firefox 용 솔루션을보십시오.

    일부 브라우저 버그를 비난 할 수도 있습니다.이 질문과 Firefox 용 솔루션을보십시오.

    Firefox는 Ajax 요청 리디렉션 중 사용자 정의 헤더를 보존하지 않습니다 : ASP.NET MVC 솔루션

    IE는 또한 더 심각한 다음 요청 방법의 감지 캐싱 문제가 발생했습니다.

    어쨌든 캐싱을 피하기 위해 캐시 버스터를 추가해야하므로 다른 플래그를 사용하여 아약스 호출을 지정하는 것이 좋습니다. 그렇지 않으면 http://ajax.mysite.com/endpoint/sevice?params와 같은 다른 URL을 사용할 수 있습니다.

  8. ==============================

    8.

    $headers = apache_request_headers();
    $is_ajax = (isset($headers['X-Requested-With']) && $headers['X-Requested-With'] == 'XMLHttpRequest');
    
  9. ==============================

    9.HTTP 요청이 진정으로 AJAX를 통해 전송되는지 확인하는 가장 좋은 해결책은 세션 검사를 사용하고, get 매개 변수에서 session_id를 전송하고 허용 된 경우이 세션을 검사하는 것입니다.

    HTTP 요청이 진정으로 AJAX를 통해 전송되는지 확인하는 가장 좋은 해결책은 세션 검사를 사용하고, get 매개 변수에서 session_id를 전송하고 허용 된 경우이 세션을 검사하는 것입니다.

  10. ==============================

    10.나는 Pekka에 동의한다. 클라이언트가 AJAX를 사용하여 실제로 엔드 포인트를 호출하는 경우 자동 감지 할 수있는 앞면과 뒷면 사이에 신뢰할 수있는 네이티브 메소드가 없습니다.

    나는 Pekka에 동의한다. 클라이언트가 AJAX를 사용하여 실제로 엔드 포인트를 호출하는 경우 자동 감지 할 수있는 앞면과 뒷면 사이에 신뢰할 수있는 네이티브 메소드가 없습니다.

    내 자신의 사용을 위해 클라이언트가 내 끝점 중 하나를 요청하는지 확인하는 몇 가지 주요 방법이 있습니다.

  11. from https://stackoverflow.com/questions/2579254/does-serverhttp-x-requested-with-exist-in-php-or-not by cc-by-sa and MIT license