2012-06-01 5 views
2

그래서 나는 다음과 같은 코드가 있습니다 :다른 도메인에서 이미지와 자바 스크립트 HTML5의 drawImage

var element = document.getElementById("myCanvas"); 
var width = element.width;         
var height = element.height; 
var context = element.getContext("2d");      

/* test 1 */ 
var img1 = new Image(width, height); 
img1.src = "http://www.mydomain.com/image.jpg"; 

document.body.appendChild(img1);   // <-- A: this works 
context.drawImage(img1,0,0,width,height); // <-- B: this works 

/* test 2 */ 
var img2 = new Image(width, height); 
img2.src = "http://www.notmydomain.com/image.jpg"; 

document.body.appendChild(img2);   // <-- C: this works 
context.drawImage(img2,0,0,width,height); // <-- D: this does not work 

그래서 동일한 도메인에서 호스팅되는 사진과 함께 이미지 객체를 생성 test 1에, 내 코드를보고 좋아 내 페이지로. A:에서 정확하게로드 된 것을 볼 수 있습니다 (A:C:은 img 객체가 올바르게로드되었는지 테스트하기 위해 throw됩니다). 그리고 B:도 작동합니다. 이미지를 캔버스에 그립니다.

test 2에서 내 페이지의 도메인과 다른 도메인에 호스팅 된 이미지를로드합니다. C:이 정상적으로 작동하며 다른 도메인에서 호스팅되는 이미지를로드 할 수 있음을 알고 있습니다. 그러나 D:이 작동하지 않습니다. 나의 이해에서이 의미

Error: uncaught exception: [Exception... "Security error" code: "1000" nsresult: "0x805303e8 (NS_ERROR_DOM_SECURITY_ERR)" location: ....

크로스 사이트 스크립팅로 계산됩니다 : 나는 다음과 같은 오류가 발생합니다.

1) 왜이 고려된다 크로스 사이트 스크립팅 :

그래서 여기에 질문입니까? 내 말은, 내가 을 알고있는 이유는 ... 일 때 D:이 허용되지 않는 이유는 무엇입니까? IMO 그들은 원칙적으로나 정신적으로 같은 종류입니까?

2) 일반적인 교차 사이트 스크립팅 해결 방법 이외의 다른 방법이 있습니까? AJAX를 사용하여 URL을 서버 쪽 스크립트에 전달하고 요청을 한 다음 서버에 이미지를 저장하고 URL을 반환하여 동일한 도메인에 있도록하거나 그렇지 않으면 (나는 생각한다) 원시 base64로 인코딩 된 데이터를 반환하고 캔버스 메서드를 사용하여 원시 데이터에서 데이터를 빌드 할 수있다. 나는이 중 하나를하면서 살 수 있지만 ... 나는 html5/캔버스 물건에 대해 뭔가 빠뜨린 것 같아. (신참!)

답변

3

뭔가 다른 일이 벌어지고 있습니다.

절대적으로 다른 도메인의 이미지를 그릴 수 있습니다.

http://jsfiddle.net/ZZW5V/

당신은 notyourdomain 이미지의 URL과 그 바이올린 코드에서 URL을 교체 시도해야합니다 :

다음 placekitten.com에서 이미지를 그리기 jsfiddle에서 코드입니다. 여전히 작동해야합니다.

일반적으로 이미지를 가져올 수있는 위치에서 캔버스에 이미지를 그릴 수 있어야합니다.

그 후에 할 수없는 일은 imageData이거나 캔버스를 toDataUrl으로 PNG로 저장하는 것입니다. 중요한 이유는 허용되지 않는 security reasons입니다.

제 생각에 이미지를 그려 내려는 것이 아니라 보안 규칙 중 하나를 위반하는 작업을 수행하고있는 것 같습니다.

+0

aha! 당신 말이 맞습니다. 더 많은 것을 파고 들자 마자 나는 오류를 던지고있는'.drawImage() '가 아니라는 것을 발견했다. 나중에 나왔던'.getImageData()'에 대한 호출이었다. 좋아요,이게 더 합리적 이군요.'A :'와'C :'물건으로 더 잘 맞 춥니 다. – slinkhi

2

이것은 정보가 도난 당하고있다. 다른 도메인에서 페이지를 가져 오는 데 AJAX를 사용할 수없는 것과 같은 이유입니다.

예를 들어 신용 정보를 표시하기 위해 이미지를 사용하는 은행 웹 사이트를 예로 들어 보겠습니다. 코드가 이미지를 페이지에로드 한 다음 서버로 보내면 클라이언트의 보안 정보가 도용 될 수 있습니다. 극단적 인 예이지만 유효한 것입니다.

이미지를 얻을 수 없기 때문에 페이지에 이미지를 추가 할 수 있습니다. 자바 스크립트에 이미지를로드 할 수 없습니다. 원시 이미지 데이터를 조작하고 전송할 수 있기 때문입니다.

+0

+1 감사합니다. 그래, 나는 전체 xss 노래와 춤을 알고 있지만, 내가 내 게시물에 표시했던 것을 할 수 없다는 것은 말이되지 않으며 실제로는 그것을 할 수 있음이 밝혀졌습니다. '.appendChild()'; 스크립트가 실제로 더 이상 실패했습니다 (사이먼 Sarris 응답 참조) – slinkhi

관련 문제