codememo

동일 발신기지 정책을 회피하는 방법

tipmemo 2023. 2. 27. 22:38
반응형

동일 발신기지 정책을 회피하는 방법

같은 발신기지 정책

HTML/Js의 동종 정책에 관한 커뮤니티 Wiki를 만들어, 이 토픽을 찾고 있는 유저에게 도움이 되고 싶다고 생각하고 있습니다.이것은 SO에 관해 가장 많이 검색되는 토픽 중 하나이며 통합된 Wiki는 없습니다.여기서 진행하겠습니다:)

동일한 오리진 정책은 한 오리진에서 로드된 문서 또는 스크립트가 다른 오리진에서 문서의 속성을 가져오거나 설정할 수 없도록 합니다.이 정책은 Netscape Navigator 2.0까지 거슬러 올라갑니다.

동일 원산지 정책에 대해 가장 선호하는 방법은 무엇입니까?

자세한 예시는 남겨두고 가급적 출처를 링크해 주세요.

document.domain

  • 메서드 유형: iframe.

document.domain iframe rr 。이 경우 이후 오리진 체크에 짧은 도메인이 사용됩니다.를 들어, 문서 .http://store.company.com/dir/other.html는 다음합니다.

document.domain = "company.com";

실행되면, 이는 「」를 「원점 체크」로 합니다.http://company.com/dir/page.html같은 .com은 company.com를 설정할 수 document.domain로로 합니다.othercompany.com.

이 방법을 사용하면 메인 도메인 소스의 페이지에서 서브 도메인 소스의 iframe에서 javascript를 추출할 수 있습니다.간수에 이 간 에 적합하지 .document.domain완전히 다른 영역으로 이동합니다.

출처 : https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript

Cross-Origin 리소스 공유 방법

  • 메서드 유형:에이잭스

Cross-Origin Resource Sharing(CORS)은 W3C 작업 초안이며, 오리진 간의 소스에 액세스할 때 브라우저와 서버가 통신해야 하는 방법을 정의합니다.CORS의 기본 개념은 커스텀HTTP 헤더를 사용하여 요구 또는 응답의 성공 여부를 판단하기 위해 브라우저와 서버가 서로 충분히 인식할 수 있도록 하는 것입니다.

요청의 , 어느쪽인가를 하는 것을 .GET ★★★★★★★★★★★★★★★★★」POST, 은 「」 「」 「」 「」 「」 「」입니까?text/plain 「 」, 「 」, 「 」라고의 헤더를 붙여 됩니다.OriginOrigin 헤더에는 요청 페이지의 오리진(프로토콜, 도메인 이름 및 포트)이 포함되어 있기 때문에 서버가 응답을 제공해야 하는지 여부를 쉽게 판단할 수 있습니다.:Origin을 사용하다

Origin: http://www.stackoverflow.com

가 요구를가 있다고 , 는 「」, 「」, 「」, 「」를 송신합니다.Access-Control-Allow-Origin된 것과 헤더 「」의 어느 쪽인가.*츠미야예를 들어 다음과 같습니다.

Access-Control-Allow-Origin: http://www.stackoverflow.com

이 헤더가 없거나 오리진이 일치하지 않으면 브라우저는 요청을 거부합니다.모든 것이 정상일 경우 브라우저는 요청을 처리합니다.요청 및 응답에는 쿠키 정보가 포함되어 있지 않습니다.

Mozilla 팀은 CORS에 대해 게시물에서 COS의 존재를 확인해야 한다고 제안합니다.withCredentials속성을 지정하여 브라우저가 XHR 경유 CORS를 지원하는지 여부를 확인합니다. '아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.XDomainRequest오브젝트: 모든 브라우저를 대상으로 합니다.

function createCORSRequest(method, url){
    var xhr = new XMLHttpRequest();
    if ("withCredentials" in xhr){
        xhr.open(method, url, true);
    } else if (typeof XDomainRequest != "undefined"){
        xhr = new XDomainRequest();
        xhr.open(method, url);
    } else {
        xhr = null;
    }
    return xhr;
}

var request = createCORSRequest("get", "http://www.stackoverflow.com/");
if (request){
    request.onload = function() {
        // ...
    };
    request.onreadystatechange = handler;
    request.send();
}

CORS 메서드가 기능하려면 모든 유형의 서버 헤더 메카닉에 액세스해야 합니다.단순히 서드파티 리소스에 액세스 할 수 없습니다.

출처 : http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/

window.postMessage

  • 메서드 유형: iframe.

window.postMessage 「」가 합니다.MessageEvent가 있는 되었을 때 되는 것(를 들어, 「」의 경우 이벤트핸들러)window.postMessage이치노「」를 참조해 주세요.MessageEvent.data 제공된 첫 window.postMessage , , ,origin의 .window.postMessagewindow.postMessage"A"가 호출되었습니다.source[ ] [ ]의 window.postMessage출됩니니다다

「」를 window.postMessage이벤트 리스너를 연결해야 합니다.

    // Internet Explorer
    window.attachEvent('onmessage',receiveMessage);

    // Opera/Mozilla/Webkit
    window.addEventListener("message", receiveMessage, false);

★★★★★★★★★★★★★★★.receiveMessage함수를 선언해야 합니다.

function receiveMessage(event)
{
    // do something with event.data;
}

은 iframe, iframe을 통해 .postMessage:

<script>window.parent.postMessage('foo','*')</script>

창의 문서 위치에 관계없이 창은 언제든지 다른 창에서 이 메서드에 액세스하여 메시지를 보낼 수 있습니다.따라서 메시지 수신에 사용되는 이벤트청취자는 먼저 발신원 및 가능한 경우 발신원 속성을 사용하여 메시지 발신인의 ID를 확인해야 합니다.이것은 생략할 수 없습니다.및 속성을 확인하지 않으면 사이트 간 스크립팅 공격이 활성화됩니다.

출처 : https://developer.mozilla.org/en/DOM/window.postMessage

Reverse Proxy 메서드

  • 메서드 유형:아약스

서버에 단순한 리버스 프록시를 설정하면 브라우저는 Ajax 요구에 상대 경로를 사용할 수 있으며 서버는 임의의 리모트 로케이션에 대한 프록시로서 기능합니다.

Apache에서 mod_proxy를 사용하는 경우 리버스 프록시를 설정하기 위한 기본 구성 명령은ProxyPass과 같이 사용됩니다 일반적으로 다음과 같이 사용됩니다.

ProxyPass     /ajax/     http://other-domain.com/ajax/

는 이음음음음 in 、 음 、 음 、 음 、 음 、 in in 。/ajax/web_service.xmlURL 만, 는 「URL」 「URL」 「URL」 「URL」 「」, 「URL」 「URL」의 합니다.http://other-domain.com/ajax/web_service.xml

이 방법의 흥미로운 기능 중 하나는 리버스 프록시가 요구를 여러 백엔드로 쉽게 분산할 수 있기 때문에 로드밸런서로 기능한다는 점입니다.

저는 JSONP를 사용합니다.

기본적으로 다음과 같이 추가합니다.

<script src="http://..../someData.js?callback=some_func"/>

를 참조해 주세요.

some_func()가 호출되어 데이터가 입력되었음을 알 수 있습니다.

일부 https 사이트에서는 AnyOrigin이 제대로 작동하지 않았기 때문에 https에서 잘 작동하는 것처럼 보이는 whateverorigin.org이라는 오픈소스 대안을 작성했습니다.

기트허브에 코드가 있어요

동일한 정책을 극복하는 가장 최근의 방법은 http://anyorigin.com/입니다.

이 사이트는 임의의 url을 지정하도록 만들어져 있으며, 출처와 관계없이 html/데이터를 얻을 수 있는 javascript/jquery 코드를 생성합니다.즉, 임의의 URL 또는 웹 페이지를 JSONP 요청으로 만듭니다.

꽤 도움이 될 것 같았습니다. :)

다음은 anyorigin의 javascript 코드 예시입니다.

$.getJSON('http://anyorigin.com/get?url=google.com&callback=?', function(data){
    $('#output').html(data.contents);
});

JSONP는 다음과 같습니다.

JSONP 또는 "패딩이 있는 JSON"은 기본 JSON 데이터 형식을 보완하는 것으로, 페이지가 프라이머리 서버 이외의 서버에 JSON을 요구하고 보다 의미 있게 사용할 수 있도록 하는 사용 패턴입니다.JSONP는 Cross-Origin Resource Sharing이라는 최신 방법을 대체하는 것입니다.

으로 ★★★★★★★★★★★★★★★★★★★★★★★★」window.postMessage최신 브라우저에서는 가장 신뢰할 수 있는 방법입니다.XSS 공격에 노출되지 않도록 하기 위해 약간의 작업을 더 해야 하지만 합리적인 트레이드오프입니다.

Javascript 도 몇 가지 .window.postMessage위의 다른 방법을 사용하여 오래된 브라우저와 동일한 기능을 제공합니다.

이걸 피하기 위해 PHP에서 컬을 사용했습니다.포트 82에서 웹 서비스를 실행하고 있습니다.

<?php

$curl = curl_init();
$timeout = 30;
$ret = "";
$url="http://localhost:82/put_val?val=".$_GET["val"];
curl_setopt ($curl, CURLOPT_URL, $url);
curl_setopt ($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($curl, CURLOPT_MAXREDIRS, 20);
curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5");
curl_setopt ($curl, CURLOPT_CONNECTTIMEOUT, $timeout);
$text = curl_exec($curl);
echo $text;

?>

여기 PHP 파일을 호출하는 javascript가 있습니다.

function getdata(obj1, obj2) {

    var xmlhttp;

    if (window.XMLHttpRequest)
            xmlhttp=new XMLHttpRequest();
    else
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
                document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
        }
    }
    xmlhttp.open("GET","phpURLFile.php?eqp="+obj1+"&val="+obj2,true);
    xmlhttp.send();
}

HTML은 포트 80의 WAMP에서 실행됩니다.같은 발신기지 정책이 회피되고 있습니다. :-)

언급URL : https://stackoverflow.com/questions/3076414/ways-to-circumvent-the-same-origin-policy

반응형