Безопасность в postMessage в/из сценария содержимого расширения Chrome? Возможные альтернативы?

Согласно этой статье на MDN, использование postMessage для передачи сообщений в скрипт содержимого и из него в chrome небезопасно, поскольку не может правильно определить исходное свойство, а его targetOrigin трудно безопасно передать на потенциально вредоносный сайт. Это все еще правда. Существуют ли какие-либо другие способы подтвердить источник полученного сообщения и отправлять сообщения исключительно на определенный сценарий контента? Или есть какие-то альтернативы использованию скриптов контента?


person AlexZ    schedule 26.01.2014    source источник


Ответы (1)


«Chrome» в статье на MDN относится не к «Google Chrome», а к коду расширения, который работает с привилегиями Chrome (ищите здесь другие значения слова "chrome" в Firefox).

В Google Chrome/Chromium сценарии содержимого выполняются в другой среде, чем веб-страницы (это означает, что window в сценарии содержимого отличается от window на веб-странице).
Однако, когда вы отправляете сообщение из сценария содержимого на страницу, event.source будет идентично window страницы. Таким образом, чтобы убедиться, что сообщение действительно было отправлено из скрипта (контента) на той же странице, вы можете использовать if (event.source === window) { ... }.

Если вы хотите отправить сообщение другому скрипту контента (в той же вкладке), то у вас есть два варианта:

  1. Если фреймы расположены в разных источниках или если сценарии содержимого расположены на разных вкладках, вам необходимо отправить сообщение на фоновую страницу, которая, в свою очередь, передает сообщение целевому сценарию содержимого с помощью тега Передача сообщений расширения Chrome API.
  2. Если взаимодействующие фреймы расположены в одном и том же источнике, то их переменные могут совместно использоваться напрямую без использования API передачи сообщений. Обратитесь к их window объектам, используя top, parent, <HTMLIFrameElement>.contentWindow, frames[index] и т. д.

Другой (хакерский) способ передать сообщение от одного сценария содержимого другому — через chrome.storage API. На принимающей стороне привяжите событие chrome.storage.onChanged. Чтобы «отправить» сообщение, используйте chrome.storage.local.set. Не забудьте удалить пару ключ-значение после того, как вы (не) получили сообщение.

person Rob W    schedule 26.01.2014