2010-05-27 2 views
3

다른 서버 (wamp 서버)의 scoket에 XMLHTTPRequest를 보내는 부두 서버에서 자바 스크립트를 실행하고 있습니다. 요청이 소켓으로 보내지지만 XHR 응답이 차단 된 것으로 보입니다.JSONP를 사용하여 XSS 문제를 극복하는 방법은 무엇입니까?

이 문제를 해결하기 위해 JSONP를 사용할 수 있다고 들었습니다. 그러나이 기술을 사용하는 방법에 대한 도움을 주시면 JSONP 기술을 사용하지 않으므로 자바 스크립트를 처음 접했을뿐입니다.

function sendPost(url, postdata, callback) { 

xmlHttp=GetXmlHttpObject() 

if (xmlHttp==null) { 
    alert ("Browser does not support HTTP Request") 
    return 
} 

xmlHttp.onreadystatechange=callback 
xmlHttp.open("POST",url,true) 
xmlHttp.send(postdata); 

} 

function sendInitRQ(width, height) { 

var post = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><command  type=\"init\"><width>" + width + "</width><height>" + height + "</height></command>"; 

sendPost("http://localhost:80/socket.php", post, initReturned); 

} 

나는 PHP 요청을받을 때 서버 로그를 확인할 때 PHP 소켓이 게시물을 수신한다는 것을 알고 있습니다.

JSONP 방식을 사용하는 방법을 알고 싶습니다. 나는 접근법의 시험을 보았지만 Iam stilll은 그것을하는 방법을 모르고있다.

+0

가; 다른 말로하면, 이러한 종류의 사이트 간 작업 문제는 XSS 용어의 의미가 아닙니다. – Pointy

+0

아 - 알았어. 버전 1.5.2와 1.6.4 사이에서 jQuery 자체가 그런 "빈"매개 변수를 제거하기 시작했습니다. 나는 이유를 모른다. 그래서 나는 버그를 로깅하게 될지도 모른다. – Pointy

답변

7

JSONP 기술은 HTTP 요청을 서버에 발행하고 응답에 대해 완전히 다른 메커니즘을 사용합니다. 클라이언트 페이지와 서버에서 협력 코드가 필요합니다. 서버에는 함수 호출로 JSON 블록이 래핑 된 HTTP "GET"요청에 응답하는 URL이 있어야합니다. 따라서 JSONP 트랜잭션을 이전 서버로 처리 할 수 ​​없습니다. 명시 적으로 기능을 제공하는 서버 여야합니다.

아이디어는 클라이언트 측 코드가 <script> 블록을 동적으로 만들고 "src"속성을 JSONP 서버의 URL로 설정한다는 것입니다. URL에는 JSON 데이터로 호출 할 것으로 예상되는 Javascript 함수의 이름을 서버에 알려주는 매개 변수가 있어야합니다. (사용할 매개 변수 이름은 서버에 따라 다르지만 일반적으로 "콜백"이지만 "jsonp"를 사용하는 일부를 보았습니다.) 클라이언트는 물론 전역 범위에서이 기능을 사용해야합니다. 당신이

function handleJSON(json) { 
    var something = json.something; 
    // ... whatever ... 
} 

같은 기능이있는 경우 즉, 다음 URL은 "handleJSON"를 호출하도록 서버를 알려줍니다, 서버 응답은 다음과 같아야합니다

handleJSON({"id": 102, "something": { "more": "data", "random": true }}); 

을 따라서 때 <script> 블록 당신이 지정한 "src"URL에서로드되면 브라우저는 내용 (서버의 응답)을 해석하고 함수가 호출됩니다.

클라이언트가 다른 보안 사이트와 활성 세션에 액세스 할 수 있도록 클라이언트에서 실행하기 위해 코드를 전송하기 때문에 신뢰할 수있는 서버에만 JSONP 요청을 보내야합니다.

편집 — 다음은 좋은 기사입니다 : 이것은 크로스 사이트 스크립팅 (XSS)과 아무 상관이없는 http://www.ibm.com/developerworks/library/wa-aj-jsonp1/

+1

"귀하의 클라이언트가 다른 보안 사이트와 연결된 활성 세션에 대한 액세스 권한"에 관해서는 ... 이것이 맞습니까? 다른 탭/창/iframe에있는 다른 가능한 열린 사이트가 아니라 요청을 발행 한 페이지의 컨텍스트에 제한 될 것이라고 생각했습니다. – jjmontes

+1

글쎄, 그것은 귀하의 페이지로 가져온 자바 스크립트이며, 다른 자바 스크립트가 할 수있는 모든 것을 할 수 있습니다. 예를 들어, 페이지에서 Google의 jQuery와 같은 것을로드 할 수 있으며 jQuery의 복사본에는 자신의 사이트에서로드 한 jQuery와 동일한 기능이 있습니다.그러나 모든 것이 창 단위/탭 단위로 이루어 지므로 한 탭의 코드에는 홈 뱅킹 창에 대한 가시성이나 액세스 권한이 없습니다 (그러나 홈 뱅킹 사이트에 게시하면 브라우저 **는 * * 열린 세션 쿠키 등을 보내면 CSRF 공격에 의존합니다. – Pointy

관련 문제