source

$_SERVER[``를 사용 가능HTTP_X_REQUESTED_WITH']가 PHP에 존재합니까?

gigabyte 2022. 9. 6. 22:21
반응형

$_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']가능하다면요.

의 변수$_SERVERPHP의 일부가 아니기 때문에 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-Withheader를 클릭합니다.

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

이것은 php 문서 자체가 아니라 이 헤더를 설정한 다른 AJAX 라이브러리에 문서화되어 있습니다.공통 라이브러리는 다음과 같은 헤더를 전송합니다.jQuery, Mojo, 프로토타입...

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

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 프록시 또는 LiveHTTP Headers Mozilla 플러그인을 사용할 수 있습니다.링크를 만드는 것은 지루하지만 쉽게 검색된다.

따라서 HTTP 스니퍼를 사용하면 임의의 HTTP 헤더를 확보할 수 있습니다.

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

특별히 ajax request object(jQuery와 같은 프레임워크를 사용하지 않는 경우)로 설정해야 합니다.코어 Javascript는 다음과 같습니다.

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

어디에xhr요청 객체입니다.

그리고나서,PHP수신하여 글로벌 변수에 설정합니다.$_SERVER다음과 같이 합니다.

$_SERVER['HTTP_X_REQUESTED_WITH']

그 이외의 경우 $_SERVER['HTTP_X_REQUESTED_WITH']는 항상 null입니다.

주의: Javascript에서 요청이 열린 후 헤더를 설정하십시오.내 말은 그 후xhr.open()방법.

브라우저의 버그를 탓할 수도 있습니다.이 질문과 Firefox의 솔루션을 참조해 주세요.

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

IE는 또한 요청 방식 탐지보다 더 심각한 캐시 문제가 있습니다.

캐시를 피하기 위해 캐시 버스터를 추가해야 합니다.따라서 다른 플래그를 사용하여 ajax 콜을 지정하거나 http://ajax.mysite.com/endpoint/sevice?params과 같은 다른 URL을 사용하는 것이 좋습니다.

Pekka에 동의합니다.클라이언트가 실제로 AJAX를 사용하여 엔드포인트를 호출하고 있는지 여부를 자동 검출할 수 있는 신뢰할 수 있는 네이티브 메서드는 전면과 후면 사이에 없습니다.

고객이 엔드포인트 중 하나를 요구하고 있는지 여부를 확인하는 주요 방법은 다음과 같습니다.

  1. HTTP_X_REQUESTED_를 사용할 수 있습니다.내가 다른 영역과 관련이 없을 때.

  2. "X-requested-with"를 체크하는 대신 $_SERVER[']를 체크합니다.(AJAX 요청에서 전송되는) HTTP_ORIGIN') 크로스 도메인 권한을 처리하려고 합니다.대부분의 경우 요청이 AJAX 요청인지 확인하는 주된 이유는 특히 이 PHP 코드 헤더('Access-Control-Allow-Origin: '.$_SERVER[')를 사용하는 교차 도메인 권한 때문입니다.HTTP_ORIGIN']; // 이 경우HTTP_ORIGIN"은 화이트리스트에 있습니다.

  3. 내 API는 클라이언트로부터 데이터 유형(JSON, HTML 등)을 GET 또는 POST var에 명시하도록 요구합니다.예를 들어 $_REQUEST['ajax']가 비어 있지 않거나 기대치와 동일한지 확인합니다.

HTTP 요구가 실제로 AJAX 경유로 송신되는지를 확인하는 최선의 솔루션은 SESSION 체크를 사용하는 것입니다.get 파라미터로 session_id를 전송하여 허용 여부를 확인합니다.

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

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

반응형