0

this article on MDN에 따르면 postMessage를 사용하여 Chrome에서 콘텐츠 스크립트와 메시지를주고받는 것은 소스 속성을 제대로 정의 할 수 없으며 targetOrigin이 잠재적으로 악의적 인 사이트로 전달하기 어렵 기 때문에 안전하지 않습니다. 여전히 사실입니까? 받은 메시지의 출처를 확인하고 메시지를 특정 콘텐츠 스크립트에만 독점적으로 보내는 다른 방법이 있습니까? 아니면 콘텐츠 스크립트를 모두 사용하는 대안이 있습니까?Chrome 확장 콘텐츠 스크립트로 /에서 PostMessage에 대한 보안을 설정 하시겠습니까? 가능한 대안?

답변

1

MDN의 기사에서 "크롬"은 "Chrome"을 의미하지 않고 Chrome 권한 (Firefox의 다른 의미는 "")으로 실행되는 확장 코드를 가리 킵니다. 구글 크롬/크롬에서

는 콘텐츠 스크립트 (즉, 콘텐츠 스크립트 window 웹 페이지에 window에서 다른 것을 의미) 웹 페이지보다 different environment에서 실행됩니다.
그러나 콘텐트 스크립트에서 페이지로 메시지를 보내면 event.source은 페이지의 window과 동일합니다. 따라서 메시지가 실제로 동일한 페이지 내의 (내용) 스크립트에서 전송되었는지 확인하려면 if (event.source === window) { ... }을 사용할 수 있습니다.

    프레임이 서로 다른 기원에 위치하는 경우
  1. , 또는 콘텐츠 스크립트가있는 경우 : 당신이 (같은 탭에서) 다른 콘텐츠 스크립트에 메시지를 보내려면

    는 다음 두 가지 옵션이 있습니다 다른 탭에있는 경우 배경 페이지로 메시지를 보내야합니다. 그러면 배경 페이지에서 Chrome extension message passing API를 사용하여 메시지를 대상 콘텐츠 스크립트로 전달합니다.

  2. 통신 프레임이 같은 출처에 있으면 메시지 전달 API를 사용하지 않고 해당 변수를 직접 공유 할 수 있습니다. 다른 하나 개의 콘텐츠 스크립트에서 메시지를받을 등

top, parent, <HTMLIFrameElement>.contentWindow, frames[index], 또 다른 (hackish) 방법을 사용하여 window 객체를 참조하면 chrome.storage API를 통해입니다. 수신 측에서는 chrome.storage.onChanged 이벤트를 바인드하십시오. 메시지를 "보내려면"chrome.storage.local.set을 사용하십시오. 키 - 값 쌍을 제거한 후에는 메시지를받지 못한 것을 잊지 마십시오.