programing

동일한 오리진 정책이 적용되는지 확인합니다.

topblog 2023. 8. 1. 20:14
반응형

동일한 오리진 정책이 적용되는지 확인합니다.

실제로 아약스 방법을 사용하기 전에 URL에 동일한 오리진 정책이 적용되는지 "안전한" 방법이 있습니까?제가 가진 것은 다음과 같습니다.

function testSameOrigin(url) {

    var loc = window.location,
        a = document.createElement('a');

    a.href = url;

    return a.hostname == loc.hostname &&
           a.port == loc.port &&
           a.protocol == loc.protocol;
}

이런 식으로 작동하지만, 위키백과 기사를 바탕으로 한 일종의 수동 추측입니다.교차 도메인 허용량을 사전 확인하는 더 좋은 방법이 있습니까?jQuery를 사용해도 됩니다.

실제로 아약스 방법을 사용하기 전에 URL에 동일한 오리진 정책이 적용되는지 "안전한" 방법이 있습니까?제가 가진 것은 다음과 같습니다.

function testSameOrigin(url) {

    var loc = window.location,
        a = document.createElement('a');

    a.href = url;

    return a.hostname == loc.hostname &&
           a.port == loc.port &&
           a.protocol == loc.protocol;
}

특정 작업을 수행하거나 수행하지 않는 경우 이 방법은 안전하고 신뢰할 수 있는 방법입니다.

이런 식으로 작동하지만, 위키백과 기사를 바탕으로 한 일종의 수동 추측입니다.

이것은 "정상적인" 상황에서 완전히 작동해야 합니다.도메인 간 스크립팅을 사용하려면 수정해야 합니다.

수정하는 경우document.domain예를 들어 "foo.example.com " 및 "bar.example.com "에서 "example.com "로 스크립트에서testSameOrigin함수가 반환됩니다.false"http://example.com "의 경우, 실제로 반환되어야 합니다.true.

수정할 예정인 경우document.domain스크립트에 해당 항목에 대한 확인을 추가하기만 하면 됩니다.

교차 도메인 통신을 허용하기 위해 CORS(위 링크 참조)를 사용할 계획인 경우 잘못된 음수도 반환됩니다.그러나 CORS를 사용하는 경우 통신할 수 있는 도메인 목록이 표시되고 이 기능에 해당 목록을 추가할 수도 있습니다.

교차 도메인 허용량을 사전 확인하는 더 좋은 방법이 있습니까?jQuery를 사용해도 됩니다.

아마도 그렇지 않을 것입니다. Steve의 답변에서 콘솔에 표시되는 내용은 "관찰자의 딜레마"일 수도 있습니다.이러한 오류는 콘솔이 다른 창을 검사하려고 할 때 발생하는 것처럼 보이지만 반드시 스크립트에서 발생하는 것은 아닙니다.

만약 당신이 장난치지 않는다면,document.domain또는 CORS를 사용하면 서버 사용 가능 여부를 확인하기 위해 추가 요청을 할 필요가 없으므로 원래 솔루션이 더 나을 수 있습니다.도메인 간 스크립팅을 수행하는 경우에도 현재 기능을 수정하여 이를 수용하는 것이 최선의 방법입니다.

흥미로운 질문입니다!검색해보니 당신이 올린 글 말고는 찾을 수 없었지만, 테스트 코드를 만지작거리다가 우연히 발견했습니다.요청하지 않고 URL을 테스트할 수 있는 간단한 방법을 원한다면, 저는 당신이 하는 방식으로 할 것입니다.테스트 요청이 필요 없는 경우 다음을 시도할 수 있습니다.

원하는 URL로 간단한 Ajax 요청:

var ajaxRequest = $.ajax({
  url: 'http://www.google.com',
  async: false
});

은 것은를반다니합환이▁a를 합니다.jqXHR개체를 확인할 수 있습니다.

ajaxRequest.isRejected(); // or...
ajaxRequest.isResolved();

자, 이것에 대한 유일한 문제는isRejected()평가할 것입니다.true페이지가 로드되지 않는 모든 경우(예: 404 찾을 수 없음 등)에 대해 다음을 사용하여 상태 코드를 확인할 수 있습니다.

ajaxRequest.status;

위 라인이 되돌아올 것 같습니다.0동일한 오리진 정책을 위반하려고 시도하지만 다른 경우에는 적절한 오류 코드(즉, 404)를 반환합니다.

마지막으로 다음과 같은 작업을 시도해 볼 수 있습니다.

function testSameOrigin(testUrl) {

  var ajaxRequest = $.ajax({
    url: testUrl,
    async: false
  });

  return ajaxRequest.isRejected() && ajaxRequest.status === 0;
}

결코 확실한 답은 아니지만, 여러분이 무엇을 찾고 있는지 알아내는 데 도움이 되기를 바랍니다!

이 솔루션도 사용해 보십시오.

function csrfSafeMethod(method) {
  // these HTTP methods do not require CSRF protection
  return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

function sameOrigin(url) {
  // test that a given url is a same-origin URL
  // url could be relative or scheme relative or absolute
  var host = window.document.location.host; // host + port
  var protocol = window.document.location.protocol;
  var srOrigin = '//' + host;
  var origin = protocol + srOrigin;
  // Allow absolute or scheme relative URLs to same origin
  return (url === origin || url.slice(0, origin.length + 1) === origin + '/') ||
    (url === srOrigin || url.slice(0, srOrigin.length + 1) === srOrigin + '/') ||
    // or any other URL that isn't scheme relative or absolute i.e relative.
    !(/^(\/\/|http:|https:).*/.test(url));
}

// if you want to check before you make a call
if (!csrfSafeMethod(data.type) && sameOrigin(data.url)) {
  // ...
}

// or if you want to set csrf token
$.ajax({
  beforeSend: function (xhr, settings) {
    if (!csrfSafeMethod(settings.type) && sameOrigin(settings.url)) {
      xhr.setRequestHeader("X-CSRFToken", getCookie("csrftoken"));
    }
  }
});

교차 도메인 스크립트를 실행하는 또 다른 방법은 JSON-P를 사용하는 것입니다. 기사를 읽을 수도 있습니다.그렇지 않으면 동일한 오리진 정책에서 교차 도메인 스크립팅이 허용되지 않습니다.

Dagg Nabbit의 대답을 바탕으로, 이것은 조금 더 완전한 것처럼 보입니다.

function sameOrigin(url) {
    var loc = window.location, a = document.createElement('a')
    a.href = url

    return a.hostname === loc.hostname &&
           a.port === loc.port &&
           a.protocol === loc.protocol &&
           loc.protocol !== 'file:'
}

내가 생각할 수 있는 주의 사항:

  • document.domain을 고려하지 않습니다.
  • CORS를 고려하지 않습니다.
  • IE7에서 작동하지 않음(자노나가 언급한 바와 같이)
  • 임의로 액세스할 수 있는 이상한 환경(안드로이드 등)에서는 작동하지 않습니다.file://프로토콜 경로(이를 확인하십시오. 안드로이드에 대한 정보가 오래되었을 수 있습니다. https://security.stackexchange.com/questions/25138/same-origin-policy-for-file-urls-in-android-browser)

언급URL : https://stackoverflow.com/questions/9404793/check-if-same-origin-policy-applies

반응형