복붙노트

Access-Control-Allow-Origin을 우회하는 방법?

PHP

Access-Control-Allow-Origin을 우회하는 방법?

그들이 아약스 호출을 방지하는 플랫폼에서 내 서버에 대한 아약스 호출을 수행하고 있습니다 (하지만 서버의 데이터베이스에서 검색된 데이터를 표시하려면 서버에서 데이터를 가져와야합니다). 내 아약스 스크립트가 작동하고, 그것을 처리 할 수 ​​있도록 내 서버의 PHP 스크립트에 데이터를 보낼 수 있습니다. 그러나 "Access-Control-Allow-Origin"에 의해 차단되어 처리 된 데이터를 다시 가져올 수 없습니다.

플랫폼의 소스 / 코어에 액세스 할 권한이 없습니다. 그래서 나는 그렇게하지 못하게하는 스크립트를 제거 할 수 없다. (P / S Google 크롬 콘솔을 사용하여이 오류를 발견했습니다.)

Ajax 코드는 아래와 같습니다.

 $.ajax({
     type: "GET",
     url: "http://example.com/retrieve.php",
     data: "id=" + id + "&url=" + url,
     dataType: 'json',   
     cache: false,
     success: function(data)
      {
        var friend = data[1];              
        var blog = data[2];           
        $('#user').html("<b>Friends: </b>"+friend+"<b><br> Blogs: </b>"+blog);

      } 
  });

또는 위의 ajax 스크립트에 대한 JSON 코드가 있습니까? 나는 JSON이 허용된다고 생각한다.

누군가가 나를 도울 수 있기를 바랍니다.

해결법

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

    1.retrieve.php 위에 놓으십시오.

    retrieve.php 위에 놓으십시오.

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

    실제 출력을 보내기 전에 header ()를 호출해야한다는 점에 유의해야합니다.

    잘못된

    <html>
    <?php
    header('Access-Control-Allow-Origin: *'); 
    ?>
    

    옳은

    <?php
    header('Access-Control-Allow-Origin: *'); 
    ?>
    <html>
    
  2. ==============================

    2.좋습니다. 그러나 여러분 모두는 *가 와일드 카드이고 모든 도메인의 크로스 사이트 스크립팅을 허용한다는 것을 알고 있습니까?

    좋습니다. 그러나 여러분 모두는 *가 와일드 카드이고 모든 도메인의 크로스 사이트 스크립팅을 허용한다는 것을 알고 있습니까?

    허용 된 모든 사이트에 대해 여러 개의 Access-Control-Allow-Origin 헤더를 보내고 싶지만 불행히도 공식적으로 지원되지 않아서 여러 개의 Access-Control-Allow-Origin 헤더를 보내거나 여러 개의 원본을 넣을 수 있습니다.

    원점을 확인하고 헤더에 허용 된 경우 원점을 돌려 보내서 해결할 수 있습니다.

    $origin = $_SERVER['HTTP_ORIGIN'];
    $allowed_domains = [
        'http://mysite1.com',
        'https://www.mysite2.com',
        'http://www.mysite2.com',
    ];
    
    if (in_array($origin, $allowed_domains)) {
        header('Access-Control-Allow-Origin: ' . $origin);
    }
    

    훨씬 더 안전합니다. 매칭을 편집하고 그것을 정규식 또는 그와 비슷한 것으로 수동 함수로 변경하고자 할 수 있습니다. 적어도 이것은 단지 1 개의 헤더 만 되돌려 보낼 것이고, 당신은 요청이 왔던 것을 확실히 알 수있을 것입니다. 모든 HTTP 헤더는 스푸핑 될 수 있지만이 헤더는 클라이언트의 보호를위한 것임에 유의하십시오. 이러한 값으로 자신의 데이터를 보호하지 마십시오. 더 많은 것을 알고 싶다면 CORS와 CSRF를 조금 읽으십시오.

    왜 더 안전한가요?

    자신의 신뢰할 수있는 사이트에서 다른 위치로의 액세스를 허용하면 세션 하이재킹을 허용합니다. 나는 약간의 예를 들고 갈 것입니다 - 페이스 북은 와일드 카드의 출처를 허용합니다 - 이것은 여러분이 자신의 웹 사이트를 어딘가에서 만들 수 있고 페이스 북으로 AJAX를 호출 (또는 iframe 열기) 할 수 있음을 의미합니다. 즉, 귀하의 웹 사이트 방문자의 페이스 북에 로그인 한 정보를 얻을 수 있습니다. 더 나쁜 것은 - POST 요청을 스크립트로 작성하고 누군가의 페이스 북에 데이터를 게시 할 수 있습니다.

    ACAO 헤더를 사용할 때는 매우 신중해야합니다!

  3. ==============================

    3.경고, Chrome (및 다른 브라우저)은 다른 답변을 따르는 경우 여러 개의 ACAO 헤더가 설정되었다는 불만을 표시합니다.

    경고, Chrome (및 다른 브라우저)은 다른 답변을 따르는 경우 여러 개의 ACAO 헤더가 설정되었다는 불만을 표시합니다.

    오류는 XMLHttpRequest가 ____을로드 할 수없는 것과 유사합니다. 'Access-Control-Allow-Origin'헤더에는 '____, ____, ____'과 같은 여러 값이 있지만 하나만 허용됩니다. 그러므로 원점 '____'은 액세스가 허용되지 않습니다.

    이 시도:

    $http_origin = $_SERVER['HTTP_ORIGIN'];
    
    $allowed_domains = array(
      'http://domain1.com',
      'http://domain2.com',
    );
    
    if (in_array($http_origin, $allowed_domains))
    {  
        header("Access-Control-Allow-Origin: $http_origin");
    }
    
  4. ==============================

    4.MVC3 컨트롤러를 호출 할 때이 문제를 해결했습니다. 나는 덧붙였다 :

    MVC3 컨트롤러를 호출 할 때이 문제를 해결했습니다. 나는 덧붙였다 :

    Response.AddHeader("Access-Control-Allow-Origin", "*"); 
    

    내 앞에

    return Json(model, JsonRequestBehavior.AllowGet);
    

    또한 내 $ .ajax는 내 ajax 호출에서 Content-type 헤더를 허용하지 않는다고 불평했다. 그래서 JSON이 Action으로 전달된다는 것을 알았 기 때문에 주석 처리했다.

    희망이 도움이됩니다.

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

    5.단일 도메인을 허용하는 것이 가장 좋으며, http : // :

    단일 도메인을 허용하는 것이 가장 좋으며, http : // :

         header('Access-Control-Allow-Origin: http://www.foo.com', false);
         header('Access-Control-Allow-Origin: http://www.foo2.com', false));
    
  6. ==============================

    6.실제로 서버에서 보낸 응답에 Access-Control-Allow-Origin 헤더를 추가하려고 시도 했습니까? 마찬가지로, Access-Control-Allow-Origin : *?

    실제로 서버에서 보낸 응답에 Access-Control-Allow-Origin 헤더를 추가하려고 시도 했습니까? 마찬가지로, Access-Control-Allow-Origin : *?

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

    7.*를 사용하는 것은 좋지 않은 생각입니다. 이로 인해 크로스 사이트 스크립팅이 활발하게 진행됩니다. 기본적으로 자신의 도메인을 항상 현재 SSL 설정으로 범위 지정하고 선택적으로 추가 도메인을 원합니다. 또한 모두를 하나의 헤더로 보내기를 원합니다. 다음은 현재 페이지와 동일한 SSL 범위에서 자신의 도메인을 항상 승인하고 선택적으로 임의의 수의 추가 도메인을 포함 할 수 있습니다. 그것들은 하나의 헤더로 모든 것을 전송할 것이고, 브라우저가 여러 개의 액세스 제어 헤더가 보내지는 것에 대해 불평 할 기회를 피하기 위해 이미 다른 것을 보낸다면 이전 헤더를 모두 덮어 쓸 것입니다.

    *를 사용하는 것은 좋지 않은 생각입니다. 이로 인해 크로스 사이트 스크립팅이 활발하게 진행됩니다. 기본적으로 자신의 도메인을 항상 현재 SSL 설정으로 범위 지정하고 선택적으로 추가 도메인을 원합니다. 또한 모두를 하나의 헤더로 보내기를 원합니다. 다음은 현재 페이지와 동일한 SSL 범위에서 자신의 도메인을 항상 승인하고 선택적으로 임의의 수의 추가 도메인을 포함 할 수 있습니다. 그것들은 하나의 헤더로 모든 것을 전송할 것이고, 브라우저가 여러 개의 액세스 제어 헤더가 보내지는 것에 대해 불평 할 기회를 피하기 위해 이미 다른 것을 보낸다면 이전 헤더를 모두 덮어 쓸 것입니다.

    class CorsAccessControl
    {
        private $allowed = array();
    
        /**
         * Always adds your own domain with the current ssl settings.
         */
        public function __construct()
        {
            // Add your own domain, with respect to the current SSL settings.
            $this->allowed[] = 'http'
                . ( ( array_key_exists( 'HTTPS', $_SERVER )
                    && $_SERVER['HTTPS'] 
                    && strtolower( $_SERVER['HTTPS'] ) !== 'off' ) 
                        ? 's' 
                        : null )
                . '://' . $_SERVER['HTTP_HOST'];
        }
    
        /**
         * Optionally add additional domains. Each is only added one time.
         */
        public function add($domain)
        {
            if ( !in_array( $domain, $this->allowed )
            {
                $this->allowed[] = $domain;
            }
        /**
         * Send 'em all as one header so no browsers grumble about it.
         */
        public function send()
        {
            $domains = implode( ', ', $this->allowed );
            header( 'Access-Control-Allow-Origin: ' . $domains, true ); // We want to send them all as one shot, so replace should be true here.
        }
    }
    

    용법:

    $cors = new CorsAccessControl();
    
    // If you are only authorizing your own domain:
    $cors->send();
    
    // If you are authorizing multiple domains:
    foreach ($domains as $domain)
    {
        $cors->add($domain);
    }
    $cors->send();
    

    당신은 아이디어를 얻습니다.

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

    8.localhost에서 테스트하는 경우 다음을 사용할 수도 있습니다. 헤더 ( 'Access-Control-Allow-Origin : http : // localhost : 8080', false); 여기서 8080은 테스트중인 포트입니다.

    localhost에서 테스트하는 경우 다음을 사용할 수도 있습니다. 헤더 ( 'Access-Control-Allow-Origin : http : // localhost : 8080', false); 여기서 8080은 테스트중인 포트입니다.

  9. from https://stackoverflow.com/questions/7564832/how-to-bypass-access-control-allow-origin by cc-by-sa and MIT license