0

В соответствии с this article on MDN использование postMessage для передачи сообщений с и из сценария содержимого в chrome не является безопасным, поскольку не может правильно определить свойство источника и что его целевому объекту сложно безопасно переходить на потенциально вредоносный сайт. Это все еще так. Существуют ли другие способы подтверждения источника полученного сообщения и только для отправки сообщений только на конкретный сценарий контента? Или есть альтернативы использованию сценариев контента вообще?Безопасность на postMessage в/из скрипта содержимого расширенного Chrome? Возможные альтернативы?

ответ

1

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

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

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

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

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

Смежные вопросы