2009-08-02 5 views
10

이것은 기괴한 일입니다. 왜 이런 일이 일어 났는지 누군가가 알 수 있었는지 궁금합니다.localhost에서 실행 중일 때 JSONP 콜백이 실행되지 않습니다.

기본적으로 나는 다른 사이트에서 사용할 수있는 JSON 웹 서비스를 구현할 수 있도록 JSONP을 테스트하려고 노력하고 있습니다. 저는 localhost, 특히 Visual Studio 2008 및 Visual Studio 2008의 내장 웹 서버 개발을하고 있습니다.

그래서 jQuery를 승/JSONP 테스트 실행으로, 나는 다음을 구현 :

$().ready(function() { 
    debugger; 
    try { 
    $.getJSON("<%= new Uri(Request.Url, "/").ToString() %>XssTest?callback=?", function(data) { 
     alert(data.abc); 
    }); 
    } catch (err) { 
    alert(err); 
    } 
}); 

그리고 서버

.. 나는에 중단 점을 설정 그래서 일이 끝입니다

<%= Request["callback"] %>({abc : 'def'}) 

서버와 나는 첫 번째 "디버거"에서 중단 점을 얻습니다. 서버 측뿐만 아니라 클라이언트 측 스크립트의 명령. JSONP URL은 실제로 페이지가로드 된 후에 호출됩니다. 그것은 위대한 일입니다.

내가 갖고있는 문제는 콜백이 실행되지 않는다는 것입니다. 필자는 Firefox 3.5뿐만 아니라 IE8에서도 이것을 테스트했습니다. 어느 쪽도 콜백을 호출하지 않습니다. 캐치 (오류)도 발생하지 않았습니다. 전혀 아무 일도 없었어!

내가 일주일 동안이 붙어, 심지어 서버가 형식을 반환 할 수 있는지 지정된 포트에 텔넷에서 수동으로 키 입력 HTTP 요청을 테스트하고 있었다 ...

callbackfn({abc : 'def'}) 

.. 그리고 그건.

는 그 다음 내가 로컬 호스트에서 호스트 이름을 변경하는 경우 globalizer으로 localhost로 무엇 떠올랐다 ('.'), 즉,이 DNS이다 예, 어떤 호스트 이름에 점을 추가하는 것은, 법적 대신 http://localhost:41559/http://localhost.:41559/을 (어떤 global::는 C# 네임 스페이스에있다). 그리고 그것은 효과가있었습니다! 인터넷 익스플로러와 파이어 폭스 3.5는 방금 점을 추가했을 때 마침내 경고 메시지를 보였다.

그래서 여기에 무슨 일이 일어나는지 궁금합니다. 왜 늦은 스크립트 태그 생성이 일반 호스트가 아닌 인터넷 호스트 이름으로 작동합니까? 아니면 올바른 질문입니까?

분명히 보안상의 이유로 구현되었지만 보안을 위해 무엇을하려고합니까 ?? 그리고 점으로 작동 시키면이 보안 기능에 보안 허점이 드러났습니까?

그건 그렇고, 내 호스트 파일은 다른 호스트 용으로 바뀌지 만 localhost에는 특별한 일이 없습니다. 기본 127.0.0.1/:: 1은 아직 대체되지 않고 계속 유지됩니다.

FOLLOW-UP : 내 hosts 파일에 다음 ..

127.0.0.1 local.mysite.com 

를 내 Global.asax에 다음 코드를 추가 :

protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    if (Request.Headers["Host"].Split(':')[0] == "localhost") 
    { 
     Response.Redirect(
      Request.Url.Scheme 
      + "://" 
      + "local.mysite.com" 
      + ":" + Request.Url.Port.ToString() 
      + Request.Url.PathAndQuery 
      , true); 
    } 
} 
나는 추가하여 지역 개발을 목적으로 지난 있어요
+0

방화 광과 같은 도구를 사용하여 JSONP에 대한 "스크립트"요청이 수행되는지 확인하고 실제로 어떤 데이터가 다시 나타나는지 확인하는 것이 좋습니다. –

+0

데이터가 유효합니다. 설명했듯이 해결 방법은 localhost (스크립트 및 데이터가 동일하게 유지 된 상태)에서 벗어나서 "고정"하지만 상황을 완전히 설명하지는 않았습니다. –

+0

그래, 그 이유는 내가 고정되지 않은 버전에 대한 사건을 기록하는 것이 좋습니다. –

답변

3

나는 거기서 대답을 던질 것이다. 몇 가지 생각을하고 나 자신의 결론에 도달했습니다.

이것은 클라이언트 컴퓨터에서 실행되는 JSONP 서비스를 호출하지 못하도록 인터넷 웹 사이트를 방해하려는 보안 기능 일 수 있습니다.

웹 사이트는 포트 목록을 통해 다른 포트 및 경로에서 localhost를 계속 호출 할 수 있습니다. 'Localhost'는 쿼리 대상과 장소에 따라 동적 인 의미의 DNS 호스트 이름 중 하나입니다. 따라서 잠재적 인 대상이 취약해질 수 있습니다. 그리고 'localhost'('localhost')에 점 (.)을 추가하면 작업 할 수있는 해결 방법이 생기는 사실은 보안 취약점을 드러내지 만 개발 목적에 대해서는 임시 해결 방법을 제공합니다.

더 나은 방법은 호스트 파일의 새로운 호스트 이름 항목에 루프백 IP를 매핑하여 로컬로 작동하고 브라우저 업데이트로 "수정"되지 않으며 다른 곳에서는 작동하지 않지만 개발 워크 스테이션에서.

1

비슷한 문제가 발생합니다. IE (7)에서 작동 해 보았던 대부분의 솔루션은 Firefox (3.5.2)를 사용하는 데 어려움을 겪고 있습니다.

내 서버의 응답이 클라이언트에서 어떻게 해석되는지 확인하기 위해 HttpFox를 설치했으며 NS_ERROR_DOM_BAD_URI가 표시됩니다. 내 상황은 조금 다르다. JSONP 호출을 호스팅 페이지를 방문한 동일한 사이트로 다시 호출하려고 시도하면이 호출은 다른 사이트로 302 리디렉션으로 응답한다. (리디렉션을 두 도메인의 쿠키를 가져 오는 편리한 방법으로 브라우저에 반환했습니다.)

저는 jQuery를 사용하고 있으며 원래 $ .ajax()를 통해 표준 AJAX 호출을 시도했습니다. 나는 초기 요청이 호스팅 페이지와 동일한 사이트에 있다고 생각했기 때문에 Firefox는 302 도메인 응답을 다른 도메인으로 추적합니다. 그러나 아니, 그것은 XSS 방어 장치의 파손으로 보였다. (Returning redirect as response to XHR request과는 달리 jQuery는 표준 dataType = "json"호출에 대한 302 리디렉션을 따르므로 동일한 도메인으로 리디렉션하면 정상적으로 작동하고 다른 도메인으로 리디렉션하면 브라우저에 NS_ERROR_DOM_BAD_URI가 생성됩니다. 같은 도메인 302 리디렉션이 다른 도메인으로 넘어갈 수없는 이유는 알 수 없습니다. 결국 리디렉션을 실행하는 것은 호스팅 페이지의 도메인이므로 신뢰할 수없는 이유는 무엇입니까? 스크립팅 주입 공격에 대해 걱정이된다면 JSONP 경로는 악의적으로 남용 될 수 있습니다 ...

jQuery 's $ .getJSON()? 콜백 =? 접미사도 Firefox에서 동일한 오류로 실패합니다. 마찬가지로 $ .getScript()를 사용하여 내 JSONP < 스크립트 > 태그를 굴릴 수 있습니다.

, $를 사용하여 다음 HTML에서 기존 < 스크립트 ID = "JSONP"유형 = "텍스트/자바 스크립트"> </스크립트 >을 가진하고 작업 ("JSONP"). ATTR을 표시 무엇

("src", url + "? callback = myCallback") JSONP 호출을 호출합니다. 그렇게하면 교차 도메인 302 리디렉션이 수행되고 내 JSON 응답이 myCallback (이는 < 스크립트/> 태그와 동시에 정의 됨)로 전달됩니다.

그리고, 예, localhost : 포트 URL을 사용하여 Cassini를 사용하여이 모든 것을 개발하고 있습니다. Cassini는 localhost가 아닌 URL에 응답하지 않으므로 위에서 시도한 솔루션에 영향을 미치는지 local.mysite.com을 쉽게 확인할 수 없습니다. 그러나 localhost의 끝에 점을 찍으면 내 모든 문제가 해결 된 것 같습니다! 이제

내가 표준 $의 아약스로 돌아갈 수는 ({... dataType와 "JSONP"...}) 로컬 호스트와 전화 __.__ : localhost 대신 포트 : 포트는 모두가 잘 . 페이지의 HTML 에 미리 존재하는 스크립트 태그의 src 속성을 수정하면이 일반 로컬 호스트 URL이 호출되도록 허용한다는 점이 흥미 롭습니다. 생각대로 처리하면 다른 보안 취약점이 될 수 있습니다.

관련 문제