programing

PHP 헤더가 있는 CORS(Cross-Origin Request Headers)

luckcodes 2022. 10. 29. 16:05

PHP 헤더가 있는 CORS(Cross-Origin Request Headers)

크로스 도메인 CORS 요청을 시도하는 간단한 PHP 스크립트가 있습니다.

<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: *");
...

하지만 여전히 오류가 발생합니다.

[ ]필드 [Request header ]의 X-Requested-With is is is is is is 。Access-Control-Allow-Headers

내가 뭘 놓친거야?

CORS 요청을 적절하게 처리하는 것은 조금 더 복잡합니다.여기에서는, 보다 완전하게(적절하게) 응답하는 기능이 있습니다.

/**
 *  An example CORS-compliant method.  It will allow any GET, POST, or OPTIONS requests from any
 *  origin.
 *
 *  In a production environment, you probably want to be more restrictive, but this gives you
 *  the general idea of what is involved.  For the nitty-gritty low-down, read:
 *
 *  - https://developer.mozilla.org/en/HTTP_access_control
 *  - https://fetch.spec.whatwg.org/#http-cors-protocol
 *
 */
function cors() {
    
    // Allow from any origin
    if (isset($_SERVER['HTTP_ORIGIN'])) {
        // Decide if the origin in $_SERVER['HTTP_ORIGIN'] is one
        // you want to allow, and if so:
        header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Max-Age: 86400');    // cache for 1 day
    }
    
    // Access-Control headers are received during OPTIONS requests
    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
        
        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
            // may also be using PUT, PATCH, HEAD etc
            header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
        
        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
            header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
    
        exit(0);
    }
    
    echo "You have CORS!";
}

보안상의 주의사항

HTTP_ORIGIN 헤더를 승인된 오리진 목록과 대조합니다.

출처가 승인되지 않은 경우 요청을 거부해야 합니다.

스펙을 읽어주세요.

TL;DR

브라우저가 사이트 간 요청을 실행할 경우 먼저 URL에 대한 "사전 전송" 요구로 문제가 없음을 확인합니다.CORS를 허용하면 이 URL로부터의 응답을 다른 도메인과 공유할 수 있음을 브라우저에 알립니다.

CORS는 서버를 보호하지 않습니다.CORS는 브라우저에 다른 도메인과의 응답 공유에 관한 제한을 지시함으로써 사용자를 보호하려고 합니다.일반적으로 이러한 공유는 완전히 금지되어 있기 때문에 CORS는 브라우저의 정상적인 보안 정책에 구멍을 뚫는 방법입니다.이러한 구멍은 가능한 한 작게 해야 합니다.따라서 항상 HTTP_ORIGIN을 내부 목록과 대조하여 확인하십시오.

여기에는 몇 가지 위험이 있습니다.특히 URL이 제공하는 데이터가 정상적으로 보호되고 있는 경우에는 더욱 그렇습니다.다른 서버에서 발신된 브라우저 컨텐츠가 서버의 데이터를 읽거나 조작할 수 있도록 사실상 허용하고 있습니다.

만약 당신이 CORS를 사용한다면, 프로토콜을 잘 읽고(매우 작음) 당신이 무엇을 하고 있는지 이해하도록 하세요.이를 위해 코드 샘플에 참조 URL이 제공됩니다.

헤더 보안

HTTP_ORIGIN 헤더는 안전하지 않은 것으로 확인되었습니다.이것은 사실입니다.실제로 모든 HTTP 헤더는 이 용어의 다양한 의미에 대해 안전하지 않습니다.헤더에 검증 가능한 시그니처/hmac이 포함되어 있거나 TLS를 통해 컨버세이션 전체가 인증되지 않는 한 헤더는 "브라우저가 알려준 것"일 뿐입니다.

이 경우 브라우저에 "도메인 X의 오브젝트가 이 URL에서 응답을 받고 싶은데 괜찮으시겠습니까?"라고 표시됩니다.CORS의 요점은 "네, 허락하겠습니다"라고 대답할 수 있는 것입니다.

같은 에러가 발생하여 백엔드 스크립트에서 다음 PHP로 수정하였습니다.

header('Access-Control-Allow-Origin: *');

header('Access-Control-Allow-Methods: GET, POST');

header("Access-Control-Allow-Headers: X-Requested-With");

Access-Control-Allow-Headers허가하지 않다*여기서 Mozilla 문서를 참조하십시오.

아스타리스크 대신 승인된 헤더를 전송해야 합니다(먼저X-Requested-With에러가 나타내는 대로).

업데이트:

*현재 받아들여지고 있는 것은Access-Control-Allow-Headers.

MDN Web Docs 2021에 따르면:

*는 credential이 없는 요구(HTTP cookie 또는 HTTP 인증정보가 없는 요구)의 특수한 와일드카드 값으로만 카운트됩니다.credential이 있는 요청에서는 리터럴헤더명으로 취급됩니다.*특별한 의미론 없이.Authorization 헤더는 와일드카드를 사용할 수 없으며 항상 명시적으로 나열해야 합니다.

인터넷 전체의 많은 설명에서는, 다음의 지정에 대해서는 언급하지 않습니다.Access-Control-Allow-Origin충분하지 않습니다.다음은 나에게 도움이 되는 완전한 예입니다.

<?php
    if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
        header('Access-Control-Allow-Origin: *');
        header('Access-Control-Allow-Methods: POST, GET, DELETE, PUT, PATCH, OPTIONS');
        header('Access-Control-Allow-Headers: token, Content-Type');
        header('Access-Control-Max-Age: 1728000');
        header('Content-Length: 0');
        header('Content-Type: text/plain');
        die();
    }

    header('Access-Control-Allow-Origin: *');
    header('Content-Type: application/json');

    $ret = [
        'result' => 'OK',
    ];
    print json_encode($ret);

드롭존과 다른 플러그인이 이 수정과 함께 작동하도록 할 수 있었습니다(angularjs + php 백엔드).

 header('Access-Control-Allow-Origin: *'); 
    header("Access-Control-Allow-Credentials: true");
    header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
    header('Access-Control-Max-Age: 1000');
    header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token , Authorization');

업로드에 추가합니다.php 또는 요청을 보내는 위치(예를 들어 upload.dload가 있고 업로드할 파일을 첨부해야 하는 경우)를 지정합니다.php, 복사하여 붙여넣습니다.)또한 크롬/모질라에서 CORS 플러그인/애드돈을 사용하는 경우 CORS를 활성화하기 위해 여러 번 전환해야 합니다.

PHP에서 CORS 서비스를 만들고 싶다면 이 코드를 파일 내의 요청을 처리하는 첫 번째 단계로 사용할 수 있습니다.

// Allow from any origin
if(isset($_SERVER["HTTP_ORIGIN"]))
{
    // You can decide if the origin in $_SERVER['HTTP_ORIGIN'] is something you want to allow, or as we do here, just allow all
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
}
else
{
    //No HTTP_ORIGIN set, so we allow any. You can disallow if needed here
    header("Access-Control-Allow-Origin: *");
}

header("Access-Control-Allow-Credentials: true");
header("Access-Control-Max-Age: 600");    // cache for 10 minutes

if($_SERVER["REQUEST_METHOD"] == "OPTIONS")
{
    if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_METHOD"]))
        header("Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT"); //Make sure you remove those you do not want to support

    if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_HEADERS"]))
        header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

    //Just exit with 200 OK with the above headers for OPTIONS method
    exit(0);
}
//From here, handle the request as it is ok

angular 4를 클라이언트 측으로, PHP를 서버 측으로 사용할 경우 이 정도의 코드가 다운됩니다.

header("Access-Control-Allow-Origin: *");

CORS의 기능을 제대로 이해하지 못하면 골칫거리가 될 수 있습니다.PHP로 사용하고 있기 때문에 문제없이 동작합니다.여기를 참조해 주세요.

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Max-Age: 1000");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");
header("Access-Control-Allow-Methods: PUT, POST, GET, OPTIONS, DELETE");

이것은 효과가 있을 것이다.

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");

이 5개의 헤더를 사용하고 나서, cors 에러를 해결했습니다(백엔드:PHP, 프론트엔드:VUE JS).

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS, post, get');
header("Access-Control-Max-Age", "3600");
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');
header("Access-Control-Allow-Credentials", "true");

.htaccess에서 이 코드를 추가합니다.

app_key, auth_key와 같은 헤더에 사용자 지정 인증 키를 추가합니다.기타

Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Headers: "customKey1,customKey2, headers, Origin, X-Requested-With, Content-Type, Accept, Authorization"

언급URL : https://stackoverflow.com/questions/8719276/cross-origin-request-headerscors-with-php-headers