четверг, 20 февраля 2014 г.

Кросс-сайтовые запросы

Обычные веб-страницы используют 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 просто не будет работать. Так что актуальность этого совета тоже под большим вопросом. Однако, все же лучше придерживаться подобной практики – это формирует правильный подход к разработке.

Комментариев нет:

Отправить комментарий