Обычные веб-страницы используют XMLHttpRequest чтобы обмениваться данными с удаленным сервером, но они ограничены same origin policy. Это правило разрешает обмен только с тем сайтом, откуда была загружена страница. Расширение браузера имеет менее строгие ограничения. Оно может обмениваться данными с любыми сайтами, указанными в свойстве permissions.
Origin расширения
Каждое запущенное расширение работает в собственной песочнице. Без явного указания необходимых привилегий в манифесте, оно может использовать запросы XMLHttpRequest только для доступа к собственным файлам:
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = handleStateChange; // Implemented elsewhere.
xhr.open("GET", chrome.extension.getURL('/config_resources/config.json'), true);
xhr.send();
файл config.json находится в папке config_resources, которая лежит в папке(или архиве) с расширением.
Запросы к любым сайтам будут блокированы. Будут блокированы также любые другие запросы к сетевым ресурсам (загрузка скриптов, стилей, изображений и т.д.)
Чтобы это стало можно, нужно прописать соответствующие разрешения в манифесте:
{
"name": "My extension",
...
"permissions": [
"http://www.google.com/"
],
...
}
Могут быть указаны как полные адреса сайтов, так и паттерны:
паттерн http://*/ разрешает кроссайтовые запросы к любым сайтам. Не злоупотребляйте этой возможностью без необходимости
Паттерны похожи на те что используются для контентных скриптов, но используется только часть задающая хост, путь игнорируется.
Вопросы безопасности
В первую очередь, нам рекомендуют не использовать eval, как-то забывая о том что по умолчанию использование eval запрещено CSP. Видимо это осталось с тех пор, когда использовался манифест первой версии. Если вы разрабатываете расширение сейчас, и используете рекомендованную версию манифеста, 2ую, то eval у вас просто не выполнится.
Второй момент – не вставляйте полученные данные как готовый HTML код, через innerHTML. От сторонних сайтов вы должны получать только данные, а разметку формировать сами. Но опять же, CSP запрещает загрузку любых внешних ресурсов и использование встроенных скриптов. И вредоносный код вставленный через innerHTML просто не будет работать. Так что актуальность этого совета тоже под большим вопросом. Однако, все же лучше придерживаться подобной практики – это формирует правильный подход к разработке.
Комментариев нет:
Отправить комментарий