Program Tip

$ _SERVER [ 'HTTP_X_REQUESTED_WITH']가 PHP에 존재합니까?

programtip 2020. 11. 14. 11:00
반응형

$ _SERVER [ 'HTTP_X_REQUESTED_WITH']가 PHP에 존재합니까?


여기 Stack Overflow에도 포함 된 인터넷을 통해 사람들은 요청이 AJAX인지 여부를 확인하는 좋은 방법은 다음을 수행하는 것이라고 말합니다.

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

그러나, 나는 볼 수 없습니다 $_SERVER['HTTP_X_REQUESTED_WITH']공식 PHP 문서

그리고 다음을 시도 할 때 :

echo $_SERVER['HTTP_X_REQUESTED_WITH'];

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

내가 뭘 잘못하고 있니? $_SERVER['HTTP_X_REQUESTED_WITH']가능하다면 정말 사용 하고 싶거든요.


의 변수는 $_SERVER실제로 PHP의 일부가 아니므로 PHP 문서에서 찾을 수 없습니다. 스크립팅 언어로 전달하는 웹 서버에 의해 준비됩니다.

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

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


cURL로 헤더를 쉽게 스푸핑 할 수 있다는 것을 잊지 마십시오.

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

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


이 헤더는 모든 AJAX 라이브러리에서 진행중인 표준화입니다.

PHP 문서에 문서화되지 않고이 헤더를 설정하는 다른 AJAX 라이브러리에 문서화됩니다. 공통 라이브러리는 jQuery, Mojo, Prototype, ...

일반적으로 이러한 라이브러리는 다음을 사용하여 헤더를 설정합니다.

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

다음은 사용 예제가있는 빠른 기능입니다.

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';
}

echo $_SERVER['HTTP_X_REQUESTED_WITH'];

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

생명, 우주, 모든 것에 대한 궁극적 인 질문에 대한 답 -HTTP 스니퍼 ! 하나를 얻고 $ _SERVER 변수를 인쇄하지 마십시오.

Firebug에는 하나가 있거나 Fiddler HTTP 프록시 또는 LiveHTTPHeaders Mozilla 플러그인을 사용할 수 있습니다. 나는 링크를 만드는 것이 지루하지만 쉽게 검색했습니다.

따라서 HTTP 스니퍼를 사용하면 모든 HTTP 헤더를 확인할 수 있습니다.

Note that you can't prevent any "direct access" by using XHR, as every HTTP request to your server is already "direct".


You can also blame some browser bugs - see this question and its solution for Firefox

Firefox does not preserve custom headers during Ajax request redirect: an ASP.NET MVC solution

IE also having caching issue which is more serious then detection of request method.

You anyway needs to add cache busters to avoid caching, so why not use another flag to specify the ajax call - or more better you can use different URL like http://ajax.mysite.com/endpoint/sevice?params


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

The best solution to make sure if an HTTP request is truly sent via AJAX is using SESSION checking , you send session_id in a get parameter and you check this session if it's allowed or not !


I agree Pekka. There is no reliable native method between front side and back side that can auto-detect if a client is really calling an endpoint using AJAX.

For my own use, I have few main ways to check if a client is requesting one of my endpoint:

  1. I can use HTTP_X_REQUESTED_WITH when I'm not in cross domain context.

  2. instead of checking "X-requested-with", I'm checking $_SERVER['HTTP_ORIGIN'] (that is sent from AJAX request) intending to handle cross domain permissions. Most of time, the main reason why I'm checking if a request is an AJAX request, is especially because of cross domain permissions, using this PHP code: header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']); // If this "HTTP_ORIGIN" is in my white list

  3. my APIs expect from the client to explicit, in few cases, the datatype (JSON, HTML etc.) into a GET or a POST var. For example, I check if $_REQUEST['ajax'] is not empty or equal to an expected value.

참고URL : https://stackoverflow.com/questions/2579254/does-serverhttp-x-requested-with-exist-in-php-or-not

반응형