IHOR.DEVБАЗА_ЗНАНЬ
МЕНЮ

~/blog / Безпека / web-accessible-resources-without-data-leaks.md

// посібник · 2 хв читання

Ресурси, доступні вебсторінкам, без витоку даних

Відкривайте лише потрібні ресурси визначеним origin, уникайте широких wildcards, розумійте dynamic URL та перевіряйте HTML і повідомлення.

Коротка відповідь

Web-accessible resources відкривають пакетні файли визначеним origin чи extension IDs. Оголошуйте лише потрібне сторінці, як icon чи ресурс стилів. Контентному скрипту не потрібне таке оголошення для запуску. Не використовуйте resources: ["*"] замість короткого списку.

Відкриття не є авторизацією чи зберіганням секретів. Дозволений сайт читає файл, а HTML створює нову межу вводу. Перевірте config, debug і дані до wildcard. Приватне не має бути в пакеті незалежно від налаштування.

Практичні кроки реалізації

Перелічіть ресурси сторінки

Простежте URL images, styles, fonts та iframes. Сторінки розширення зі своїми ресурсами відрізняються від web-сторінок. Інспектор Font Picker є сценарієм, не доказом конкретного оголошення. Перевірте маніфест.

Обмежте файли й caller

Обирайте точні шляхи й origin. Wildcard рекурсивно відкриє майбутні файли. Chrome використовує origin і потребує /*; це не обмеження одним шляхом сторінки. Для відомого іншого розширення використовуйте extension_ids.

Точно оцініть dynamic URL

use_dynamic_url дає ID сесії після restart чи reload. Генеруйте через runtime.getURL без старого кешу. Це зменшує сталі probes, не робить відкритий файл приватним. Перевірте версію й lifecycle.

Окремо перевірте активні поверхні

HTML потребує перевірки query, fragment і messages. Перехід до extension URL не доводить довіреного caller. Привілеї окремі, sender валідний, HTML без недовіреного вводу. Якщо вистачає image, активна сторінка зайва.

Приклад реалізації

Фрагмент відкриває один asset умовному HTTPS-origin. Додайте до маніфесту й генеруйте URL зі скрипта. Це доступ ресурсу, не host-доступ операцій.

{
  "web_accessible_resources": [{
    "resources": ["assets/inspector-icon.svg"],
    "matches": ["https://app.example.com/*"],
    "use_dynamic_url": true
  }]
}
const icon = document.createElement("img");
icon.src = chrome.runtime.getURL("assets/inspector-icon.svg");
icon.alt = "";
document.documentElement.append(icon);

Змістовний icon потребує alt; порожній тут для сусіднього пояснення. Перевірте потрібний і сторонній origin та reload. ZIP має не відкривати зайве wildcard.

Компроміси та альтернативи

Точні assets потребують оновлення, але зміни явні. Directory-pattern зменшує підтримку ціною майбутнього відкриття. Окремі caller-правила простіші. Зручність обирайте після перевірки всіх файлів.

Поширені помилки

  • Весь build відкритий.
  • Зайве оголошення скриптів.
  • Page-path як обмеження matches.
  • Dynamic URL як шифрування.
  • Debug-дані через wildcard.

Контрольний список перед випуском

  • Файли мають consumer.
  • Origin чи IDs обмежені.
  • Wildcards звірено з ZIP.
  • Reload перевірено.
  • HTML валідує ввід.
  • Секретів у пакеті немає.

Поширені запитання

Чи runtime.getURL відкриває ресурс?

Ні. Він будує URL. Правила маніфесту визначають доступ web-origin.

Чи matches обмежує шлях?

Не тут. Chrome зіставляє origin із /*. Шлях функції перевіряйте в коді.

Висновок

Відкривайте passive вузько, active як нову межу вводу. Перевіряйте пакет кожного випуску: старий wildcard відкриє новий файл.

Первинні джерела

Пов’язані посібники та приклади

Ігор Харчишин

Незалежний full-stack інженер продуктів, який пише посібники з реалізації розширень браузера та сучасних вебпродуктів на основі першоджерел.

Потрібно реалізувати це у вашому продукті?

Інструменти браузера з чіткою метою, обґрунтованими дозволами та підтримуваною архітектурою Manifest V3.