Browser Extension Pentesting Methodology

Support HackTricks

Basic Information

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рд▓реЛрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ DOM рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдиреНрдп рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ DOM рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреНрдп рд╕рд╛рдЗрдЯреЛрдВ рдХреА рдЧреЛрдкрдиреАрдпрддрд╛, рдЕрдЦрдВрдбрддрд╛ рдФрд░ рдЙрдкрд▓рдмреНрдзрддрд╛ (CIA) рдХреЛ рдЦрддрд░реЗ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред

Main Components

рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓реЗрдЖрдЙрдЯ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд▓рдЧрддреЗ рд╣реИрдВ рдЬрдм рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рддреАрди рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВред рдЖрдЗрдП рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреЛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рджреЗрдЦреЗрдВред

Content Scripts

рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкрд╛рд╕ рдПрдХрд▓ рд╡реЗрдм рдкреГрд╖реНрда рдХреЗ DOM рддрдХ рд╕реАрдзреА рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЙрдЬрд╛рдЧрд░ рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

Extension Core

рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛрд░ рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░/рдкрд╣реБрдБрдЪ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛрд░ рдХреЗрд╡рд▓ XMLHttpRequest рдФрд░ рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реЗрдм рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛрд░ рдХреЗ рдкрд╛рд╕ рд╣реЛрд╕реНрдЯ рдорд╢реАрди рддрдХ рд╕реАрдзреА рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

Native Binary

рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдПрдХ рдиреИрдЯрд┐рд╡ рдмрд╛рдЗрдирд░реА рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╣реЛрд╕реНрдЯ рдорд╢реАрди рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИред рдиреИрдЯрд┐рд╡ рдмрд╛рдЗрдирд░реА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛрд░ рдХреЗ рд╕рд╛рде рдорд╛рдирдХ рдиреЗрдЯрд╕реНрдХреЗрдк рдкреНрд▓рдЧрдЗрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЗрдВрдЯрд░рдлреЗрд╕ (NPAPI) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдлреНрд▓реИрд╢ рдФрд░ рдЕрдиреНрдп рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкреНрд▓рдЧ-рдЗрдиреНрд╕ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

Boundaries

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдпрд╣ рдордирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ рд╡рд╣ рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдЗрдирдкреБрдЯ рдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдХреЛрд░ рдореЗрдВ рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдХреЛрд░ рд╕реЗ рдиреИрдЯрд┐рд╡ рдмрд╛рдЗрдирд░реА рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗред

рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреЛ рдордЬрдмреВрдд рд╕реБрд░рдХреНрд╖рд╛рддреНрдордХ рд╕реАрдорд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдЕрд▓рдЧ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИред рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛрд░ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВ рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдкрдиреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡реЗрдм рдкреГрд╖реНрдареЛрдВ рд╕реЗ рдЕрд▓рдЧ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реАрдк рдореЗрдВ рдЪрд▓рддреА рд╣реИред рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╡реЗрдм рдкреГрд╖реНрда рдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд DOM рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рджреЛрдиреЛрдВ рдХрднреА рднреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ, рдЬрд┐рд╕рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд▓реАрдХ рд╣реЛрдирд╛ рд░реЛрдХрддрд╛ рд╣реИред

manifest.json

рдПрдХ рдХреНрд░реЛрдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрд╕ рдПрдХ рдЬрд╝рд┐рдк рдлрд╝реЛрд▓реНрдбрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ .crx рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реЛрддрд╛ рд╣реИред рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдХреЛрд░ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рд░реВрдЯ рдкрд░ manifest.json рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдЬреЛ рд▓реЗрдЖрдЙрдЯ, рдЕрдиреБрдорддрд┐рдпреЛрдВ рдФрд░ рдЕрдиреНрдп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред

Example:

{
"manifest_version": 2,
"name": "My extension",
"version": "1.0",
"permissions": [
"storage"
],
"content_scripts": [
{
"js": [
"script.js"
],
"matches": [
"https://example.com/*",
"https://www.example.com/*"
],
"exclude_matches": ["*://*/*business*"],
}
],
"background": {
"scripts": [
"background.js"
]
},
"options_ui": {
"page": "options.html"
}
}

content_scripts

рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рд▓реЛрдб рд╣реЛрддреА рд╣реИрдВ рдЬрдм рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдорд┐рд▓рддреЗ-рдЬреБрд▓рддреЗ рдкреГрд╖реНрда рдкрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдИ рднреА рдкреГрд╖реНрда рдЬреЛ https://example.com/* рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдФрд░ *://*/*/business* regex рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ред рдпреЗ рдкреГрд╖реНрда рдХреЗ рдЕрдкрдиреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдХреА рддрд░рд╣ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреА рд╣реИрдВ рдФрд░ рдкреГрд╖реНрда рдХреЗ рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ (DOM) рддрдХ рдордирдорд╛рдирд╛ рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИред

"content_scripts": [
{
"js": [
"script.js"
],
"matches": [
"https://example.com/*",
"https://www.example.com/*"
],
"exclude_matches": ["*://*/*business*"],
}
],

URLs рдХреЛ рд╢рд╛рдорд┐рд▓ рдпрд╛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП include_globs рдФрд░ exclude_globs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИред

рдпрд╣ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдЬреЛ рдкреГрд╖реНрда рдкрд░ рдПрдХ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдмрдЯрди рдЬреЛрдбрд╝реЗрдЧреА рдЬрдм рд╕реНрдЯреЛрд░реЗрдЬ API рд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕реНрдЯреЛрд░реЗрдЬ рд╕реЗ message рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

chrome.storage.local.get("message", result =>
{
let div = document.createElement("div");
div.innerHTML = result.message + " <button>Explain</button>";
div.querySelector("button").addEventListener("click", () =>
{
chrome.runtime.sendMessage("explain");
});
document.body.appendChild(div);
});

рдЬрдм рдЗрд╕ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреГрд╖реНрдареЛрдВ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, runtime.sendMessage() API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред рдпрд╣ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА APIs рддрдХ рд╕реАрдзреЗ рдкрд╣реБрдВрдЪ рдХреА рд╕реАрдорд╛ рдХреЗ рдХрд╛рд░рдг рд╣реИ, рдЬрд┐рд╕рдореЗрдВ storage рдХреБрдЫ рдЕрдкрд╡рд╛рджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЗрди рдЕрдкрд╡рд╛рджреЛрдВ рд╕реЗ рдкрд░реЗ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд╕рдВрджреЗрд╢ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреГрд╖реНрдареЛрдВ рдкрд░ рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд┐рдирд╕реЗ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд╡рд╛рдж рдХрд░ рд╕рдХрддреА рд╣реИрдВред

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдХреНрд╖рдорддрд╛рдПрдБ рдереЛрдбрд╝реА рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдХреНрд░реЛрдорд┐рдпрдо-рдЖрдзрд╛рд░рд┐рдд рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рд╕реВрдЪреА Chrome Developers documentation рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдФрд░ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП, MDN рдореБрдЦреНрдп рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкрд╛рд╕ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдХреНрд░рд┐рдпрд╛рдПрдБ рдХрд░рдиреЗ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ рд╡рд╛рдкрд╕ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред

Chrome рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Chrome рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓ рдореЗрдиреВ рдХреЛ Options > More tools > Developer tools рд╕реЗ рдпрд╛ Ctrl + Shift + I рджрдмрд╛рдХрд░ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдкрд░, Source tab рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрд╕рдХреЗ рдмрд╛рдж Content Scripts рдЯреИрдмред рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдПрдХреНрд╕рдЯреЗрдВрд╢рдиреЛрдВ рд╕реЗ рдЪрд▓ рд░рд╣реА рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

Injected content scripts

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ Content Scripts рдЕрдирд┐рд╡рд╛рд░реНрдп рдирд╣реАрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбрд╛рдпрдирд╛рдорд┐рдХрд▓реА inject рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдФрд░ tabs.executeScript рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реЗрдм рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХрд▓реА рдЙрдиреНрд╣реЗрдВ inject рдХрд░рдиреЗ рдХреА рднреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдзрд┐рдХ granular controls рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдПрдХ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдЙрд╕ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП host permissions рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред рдпреЗ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдпрд╛ рддреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдореИрдирд┐рдлреЗрд╕реНрдЯ рдореЗрдВ рдЙрдирдХреА рдорд╛рдВрдЧ рдХрд░рдХреЗ рдпрд╛ activeTab рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрд╕реНрдерд╛рдпреА рдЖрдзрд╛рд░ рдкрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред

Example activeTab-based extension

manifest.json
{
"name": "My extension",
...
"permissions": [
"activeTab",
"scripting"
],
"background": {
"service_worker": "background.js"
},
"action": {
"default_title": "Action Button"
}
}
  • рдХреНрд▓рд┐рдХ рдкрд░ рдПрдХ JS рдлрд╝рд╛рдЗрд▓ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ:

// content-script.js
document.body.style.backgroundColor = "orange";

//service-worker.js - Inject the JS file
chrome.action.onClicked.addListener((tab) => {
chrome.scripting.executeScript({
target: { tabId: tab.id },
files: ["content-script.js"]
});
});
  • рдХреНрд▓рд┐рдХ рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ:

//service-worker.js - Inject a function
function injectedFunction() {
document.body.style.backgroundColor = "orange";
}

chrome.action.onClicked.addListener((tab) => {
chrome.scripting.executeScript({
target : {tabId : tab.id},
func : injectedFunction,
});
});

рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг

// service-workser.js
chrome.scripting.registerContentScripts([{
id : "test",
matches : [ "https://*.example.com/*" ],
excludeMatches : [ "*://*/*business*" ],
js : [ "contentScript.js" ],
}]);

// Another example
chrome.tabs.executeScript(tabId, { file: "content_script.js" });

URLs рдХреЛ рд╢рд╛рдорд┐рд▓ рдпрд╛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП include_globs рдФрд░ exclude_globs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИред

рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ run_at

run_at рдлрд╝реАрд▓реНрдб рдпрд╣ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ JavaScript рдлрд╝рд╛рдЗрд▓реЗрдВ рд╡реЗрдм рдкреГрд╖реНрда рдореЗрдВ рдХрдм рдЗрдВрдЬреЗрдХреНрдЯ рдХреА рдЬрд╛рддреА рд╣реИрдВред рдкрд╕рдВрджреАрджрд╛ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди "document_idle" рд╣реИред

рд╕рдВрднрд╡ рдорд╛рди рд╣реИрдВ:

  • document_idle: рдЬрдм рднреА рд╕рдВрднрд╡ рд╣реЛ

  • document_start: css рд╕реЗ рдХрд┐рд╕реА рднреА рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рдж, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдЕрдиреНрдп DOM рдХреЗ рдирд┐рд░реНрдорд╛рдг рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЪрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗред

  • document_end: DOM рдХреЗ рдкреВрд░реНрдг рд╣реЛрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рд▓реЗрдХрд┐рди рдЫрд╡рд┐рдпреЛрдВ рдФрд░ рдлрд╝реНрд░реЗрдо рдЬреИрд╕реЗ рдЙрдк-рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд▓реЛрдб рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗред

manifest.json рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ

{
"name": "My extension",
...
"content_scripts": [
{
"matches": ["https://*.example.com/*"],
"run_at": "document_idle",
"js": ["contentScript.js"]
}
],
...
}

service-worker.js рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ

chrome.scripting.registerContentScripts([{
id : "test",
matches : [ "https://*.example.com/*" ],
runAt : "document_idle",
js : [ "contentScript.js" ],
}]);

background

рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдкреЗрдЬ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рдордиреНрд╡рдп рдореЗрдВ рдПрдХ рдХреЗрдВрджреНрд░реАрдп рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдкреЗрдЬ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рджреМрд░рд╛рди рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ, рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ (DOM) рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЬрдЯрд┐рд▓ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдФрд░ рд╕реНрдерд┐рддрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред

рдореБрдЦреНрдп рдмрд┐рдВрджреБ:

  • рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдкреЗрдЬ рдХреА рднреВрдорд┐рдХрд╛: рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд▓рд┐рдП рдирд░реНрд╡ рд╕реЗрдВрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рд╡рд┐рднрд┐рдиреНрди рднрд╛рдЧреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдФрд░ рд╕рдордиреНрд╡рдп рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред

  • рд╕реНрдерд┐рд░рддрд╛: рдпрд╣ рдПрдХ рд╣рдореЗрд╢рд╛ рдЙрдкрд╕реНрдерд┐рдд рдЗрдХрд╛рдИ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрджреГрд╢реНрдп рд▓реЗрдХрд┐рди рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИред

  • рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдирд┐рд░реНрдорд╛рдг: рдпрджрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдкреЗрдЬ рдмрдирд╛рдПрдЧрд╛ред рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдкреГрд╖реНрда рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдореИрдирд┐рдлреЗрд╕реНрдЯ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рднреА рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдмрд╛рдз рд╕рдВрдЪрд╛рд▓рди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрддрд╛ рд╣реИред

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдкреЗрдЬ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ (рдЬрдм рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ) рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХреАрдХреГрдд рдФрд░ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рд╕реЗрдЯрдЕрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред

Example background script:

chrome.runtime.onMessage.addListener((request, sender, sendResponse) =>
{
if (request == "explain")
{
chrome.tabs.create({ url: "https://example.net/explanation" });
}
})

рдпрд╣ runtime.onMessage API рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИред рдЬрдм рдПрдХ "explain" рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ tabs API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдП рдЯреИрдм рдореЗрдВ рдПрдХ рдкреГрд╖реНрда рдЦреЛрд▓рддрд╛ рд╣реИред

рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рд╡рд░рдг рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд╕реЗ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓реНрд╕ рдЦреБрд▓реЗрдВрдЧреЗ:

рд╡рд┐рдХрд▓реНрдк рдкреГрд╖реНрда рдФрд░ рдЕрдиреНрдп

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреГрд╖реНрда рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

  • рдПрдХреНрд╢рди рдкреГрд╖реНрда рддрдм рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЖрдЗрдХрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

  • рдкреГрд╖реНрда рдЬреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдПрдХ рдирдП рдЯреИрдм рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдЧрд╛ред

  • рд╡рд┐рдХрд▓реНрдк рдкреГрд╖реНрда: рдпрд╣ рдкреГрд╖реНрда рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдкрд┐рдЫрд▓реЗ рдореИрдирд┐рдлреЗрд╕реНрдЯ рдореЗрдВ, рдореИрдВ рдЗрд╕ рдкреГрд╖реНрда рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca рдпрд╛ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ:

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпреЗ рдкреГрд╖реНрда рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдкреГрд╖реНрдареЛрдВ рдХреА рддрд░рд╣ рд╕реНрдерд╛рдпреА рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЧрддрд┐рд╢реАрд▓ рд╕рд╛рдордЧреНрд░реА рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╡реЗ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдкреГрд╖реНрда рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХреНрд╖рдорддрд╛рдПрдБ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ:

  • рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░: рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдкреГрд╖реНрда рдХреЗ рд╕рдорд╛рди, рдпреЗ рдкреГрд╖реНрда рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рднреАрддрд░ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддрд╛ рд╣реИред

  • рдПрдХреНрд╕рдЯреЗрдВрд╢рди-рд╡рд┐рд╢рд┐рд╖реНрдЯ APIs рддрдХ рдкрд╣реБрдБрдЪ: рдЗрди рдкреГрд╖реНрдареЛрдВ рдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди-рд╡рд┐рд╢рд┐рд╖реНрдЯ APIs рддрдХ рд╡реНрдпрд╛рдкрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рдЬреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЗ рдЕрдзреАрди рд╣реЛрддреА рд╣реИред

permissions & host_permissions

permissions рдФрд░ host_permissions manifest.json рд╕реЗ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рд╣реИрдВ рдЬреЛ рдпрд╣ рд╕рдВрдХреЗрдд рдХрд░реЗрдВрдЧреА рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдкрд╛рд╕ рдХреМрди рд╕реА рдЕрдиреБрдорддрд┐рдпрд╛рдБ рд╣реИрдВ (рд╕реНрдЯреЛрд░реЗрдЬ, рд╕реНрдерд╛рди...) рдФрд░ рдХреМрди рд╕реЗ рд╡реЗрдм рдкреГрд╖реНрдареЛрдВ рдореЗрдВред

рдЪреВрдВрдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЗрддрдиреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдпрд╛ рдПрдХ рдЬреЛ рд╕рдордЭреМрддрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рд╣рдорд▓рд╛рд╡рд░ рдХреЛ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдЪреБрд░рд╛рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░ рдЬрд╛рд╕реВрд╕реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдзрдиреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИред

рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдпреЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ рдФрд░ рдХреИрд╕реЗ рдЗрдирдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

BrowExt - permissions & host_permissions

content_security_policy

рдПрдХ рд╕рд╛рдордЧреНрд░реА рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐ рдХреЛ manifest.json рдХреЗ рдЕрдВрджрд░ рднреА рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдПрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ, рддреЛ рдпрд╣ рдХрдордЬреЛрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧ рдХрд╛рдлреА рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ рд╣реИ:

script-src 'self'; object-src 'self';

рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП CSP рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдмрд╛рдпрдкрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреЗрдЦреЗрдВ:

Content Security Policy (CSP) Bypass

web_accessible_resources

рдХрд┐рд╕реА рд╡реЗрдмрдкреЗрдЬ рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдПрдХ рдкреГрд╖реНрда, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ .html рдкреГрд╖реНрда, рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреГрд╖реНрда рдХреЛ manifest.json рдХреЗ web_accessible_resources рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

{
...
"web_accessible_resources": [
{
"resources": [ "images/*.png" ],
"matches": [ "https://example.com/*" ]
},
{
"resources": [ "fonts/*.woff" ],
"matches": [ "https://example.com/*" ]
}
],
...
}

рдпреЗ рдкреГрд╖реНрда URL рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд╣реБрдБрдЪ рдпреЛрдЧреНрдп рд╣реИрдВ:

chrome-extension://<extension-id>/message.html

In рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рдиреЛрдВ рдореЗрдВ extension-id рдЙрдкрд▓рдмреНрдз рд╣реИ:

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ manifest.json рдкреИрд░рд╛рдореАрдЯрд░ use_dynamic_url рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ id рдЧрддрд┐рд╢реАрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣рд╛рдВ рдПрдХ рдкреГрд╖реНрда рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реЛрдиреЗ рдкрд░ рднреА, рдпрд╣ ClickJacking рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдзрдиреНрдпрд╡рд╛рдж Content Security Policy рдХреЗред рдЗрд╕рд▓рд┐рдП ClickJacking рд╣рдорд▓реЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЗрд╕реЗ рднреА рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ (frame-ancestors рдЕрдиреБрднрд╛рдЧ)ред

рдЗрди рдкреГрд╖реНрдареЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдиреЗ рд╕реЗ рдпреЗ рдкреГрд╖реНрда рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрдордЬреЛрд░ ClickJacking рдмрди рдЬрд╛рддреЗ рд╣реИрдВ:

BrowExt - ClickJacking

рдЗрди рдкреГрд╖реНрдареЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдФрд░ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ URLs рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ, ClickJacking рд╣рдорд▓реЛрдВ рдХреЛ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ web_accessible_resources рд╕реЗ рдкреГрд╖реНрда рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдЕрдиреНрдп рдкреГрд╖реНрда рднреА рдкреГрд╖реНрдарднреВрдорд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рдкреГрд╖реНрда XSS рдХреЗ рд▓рд┐рдП рдХрдордЬреЛрд░ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдмрдбрд╝реА рдХрдордЬреЛрд░реА рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ web_accessible_resources рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреГрд╖реНрдареЛрдВ рдХреЛ iframes рдХреЗ рдЕрдВрджрд░ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдирдП рдЯреИрдм рд╕реЗ рдЖрдк рдПрдХреНрд╕рдЯреЗрдВрд╢рди ID рдЬрд╛рдирдХрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреГрд╖реНрда рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдПрдХ XSS рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рдорд╛рди рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рднрд▓реЗ рд╣реА рдкреГрд╖реНрда web_accessible_resources рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред

externally_connectable

docs рдХреЗ рдЕрдиреБрд╕рд╛рд░, "externally_connectable" рдореИрдирд┐рдлреЗрд╕реНрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА рдпрд╣ рдШреЛрд╖рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдХреМрди рд╕реА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдФрд░ рд╡реЗрдм рдкреГрд╖реНрда рдЖрдкрдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реЗ runtime.connect рдФрд░ runtime.sendMessage рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  • рдпрджрд┐ externally_connectable рдХреБрдВрдЬреА рдЖрдкрдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдореИрдирд┐рдлреЗрд╕реНрдЯ рдореЗрдВ рдирд╣реАрдВ рдШреЛрд╖рд┐рдд рдХреА рдЧрдИ рд╣реИ рдпрд╛ рдЗрд╕реЗ "ids": ["*"] рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕рднреА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдИ рд╡реЗрдм рдкреГрд╖реНрда рдХрдиреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

  • рдпрджрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ IDs рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рдЧрдИ рд╣реИрдВ, рдЬреИрд╕реЗ "ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"], рддреЛ рдХреЗрд╡рд▓ рд╡рд╣реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  • рдпрджрд┐ matches рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рддреЛ рд╡реЗ рд╡реЗрдм рдРрдкреНрд╕ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ:

"matches": [
"https://*.google.com/*",
"*://*.chromium.org/*",
  • рдпрджрд┐ рдЗрд╕реЗ рдЦрд╛рд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: "externally_connectable": {}, рддреЛ рдХреЛрдИ рдРрдк рдпрд╛ рд╡реЗрдм рдХрдиреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХреЗрдЧрд╛ред

рдпрд╣рд╛рдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдФрд░ URL рдХреЗ рд╕рд╛рде, рд╣рдорд▓рд╛ рд╕рддрд╣ рдЫреЛрдЯреА рд╣реЛрдЧреАред

рдпрджрд┐ рдПрдХ рд╡реЗрдм рдкреГрд╖реНрда XSS рдпрд╛ рдЯреЗрдХрдУрд╡рд░ рдХреЗ рд▓рд┐рдП рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИ рдФрд░ рдЗрд╕реЗ externally_connectable рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдкреГрд╖реНрдарднреВрдорд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕реАрдзреЗ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдЗрд╕рдХреЗ CSP рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рддреЗ рд╣реБрдПред

рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдмрд╛рдпрдкрд╛рд╕ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдХ рд░реЙрдЧ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЗрд╕реЗ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рди рд╣реЛ, рдпрд╣ рдПрдХ рдЕрдиреБрдордд рд╡реЗрдм рдкреГрд╖реНрда рдореЗрдВ XSS рдбреЗрдЯрд╛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ WebRequest рдпрд╛ DeclarativeNetRequest APIs рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд▓рдХреНрд╖рд┐рдд рдбреЛрдореЗрди рдкрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдПрдХ рдкреГрд╖реНрда рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ JavaScript рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдмрджрд▓рддреЗ рд╣реБрдПред (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд▓рдХреНрд╖рд┐рдд рдкреГрд╖реНрда рдкрд░ CSP рдЗрди рд╣рдорд▓реЛрдВ рдХреЛ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ)ред рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рдЖрдпрд╛ рд╣реИред

рд╕рдВрдЪрд╛рд░ рд╕рд╛рд░рд╛рдВрд╢

рдПрдХреНрд╕рдЯреЗрдВрд╢рди <--> рд╡реЗрдм рдРрдк

рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╡реЗрдм рдкреГрд╖реНрда рдХреЗ рдмреАрдЪ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░ рдкреЛрд╕реНрдЯ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЖрдкрдХреЛ рдЖрдорддреМрд░ рдкрд░ window.postMessage рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдорд┐рд▓реЗрдВрдЧреЗ рдФрд░ рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ window.addEventListener рдЬреИрд╕реЗ рд╢реНрд░реЛрддрд╛ рдорд┐рд▓реЗрдВрдЧреЗред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рднреА рдПрдХ рдкреЛрд╕реНрдЯ рд╕рдВрджреЗрд╢ рднреЗрдЬрдХрд░ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдФрд░ рдЗрд╕рд▓рд┐рдП рд╡реЗрдм рдХреЛ рдЗрд╕рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП) рдпрд╛ рдмрд╕ рд╡реЗрдм рдХреЛ рдПрдХ рдирдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдЕрдВрджрд░

рдЖрдо рддреМрд░ рдкрд░ chrome.runtime.sendMessage рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЖрдорддреМрд░ рдкрд░ background рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдФрд░ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реНрд░реЛрддрд╛ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ chrome.runtime.onMessage.addListener рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ chrome.runtime.connect() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕реНрдерд╛рдпреА рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╕рдВрднрд╡ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХрд▓ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ, рдЗрд╕реЗ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ:

chrome.runtime.connect() рдЙрджрд╛рд╣рд░рдг

```javascript var port = chrome.runtime.connect();

// Listen for messages from the web page window.addEventListener("message", (event) => { // Only accept messages from the same window if (event.source !== window) { return; }

// Check if the message type is "FROM_PAGE" if (event.data.type && (event.data.type === "FROM_PAGE")) { console.log("Content script received: " + event.data.text); // Forward the message to the background script port.postMessage({ type: 'FROM_PAGE', text: event.data.text }); } }, false);

// Listen for messages from the background script port.onMessage.addListener(function(msg) { console.log("Content script received message from background script:", msg); // Handle the response message from the background script });

</details>

рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдПрдХ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдПрдХ рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрд╛ рдЬрд╛рдП рдЬреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЯреИрдм рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, **`chrome.tabs.sendMessage`** рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ, рдЬрд╣рд╛рдБ рдЖрдкрдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП **рдЯреИрдм рдХрд╛ ID** рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

### рдЕрдиреБрдорддрд┐ рдкреНрд░рд╛рдкреНрдд `externally_connectable` рд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рддрдХ

**рд╡реЗрдм рдРрдкреНрд╕ рдФрд░ рдмрд╛рд╣рд░реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЬреЛ `externally_connectable` рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЕрдиреБрдорддрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реИрдВ** рдЕрдиреБрд░реЛрдз рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ:
```javascript
chrome.runtime.sendMessage(extensionId, ...

рдЬрд╣рд╛рдБ extension ID рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

Native Messaging

рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЕрдВрджрд░ рдмрд╛рдЗрдирд░реА рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░реЗрдВ, рдЬреЛ рдХрд┐ рдпрджрд┐ рдЗрд╕ рд╕рдВрд╡рд╛рдж рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рддреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдЬреИрд╕реЗ RCEs рдХреЗ рдкреНрд░рддрд┐ рдкреНрд░рд╡рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдкрд░ рдмрд╛рдж рдореЗрдВ рдЕрдзрд┐рдХред

chrome.runtime.sendNativeMessage(
'com.my_company.my_application',
{text: 'Hello'},
function (response) {
console.log('Received ' + response);
}
);

Web тЖФя╕О Content Script Communication

рдЬрд╣рд╛рдБ content scripts рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╣рд╛рдБ рд╣реЛрд╕реНрдЯ рдкреГрд╖реНрда рдореМрдЬреВрдж рд╣реИрдВ, рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВ, рдЬреЛ рдЕрд▓рдЧрд╛рд╡ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдЕрд▓рдЧрд╛рд╡ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рджреЛрдиреЛрдВ рдХреЗ рдкрд╛рд╕ рдкреГрд╖реНрда рдХреЗ Document Object Model (DOM) рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╕рд╛рдЭрд╛ рд╕рдВрд╕рд╛рдзрди рд╣реИред рд╣реЛрд╕реНрдЯ рдкреГрд╖реНрда рдХреЛ content script рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде, рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╡реЗ рджреЛрдиреЛрдВ рдкрдХреНрд╖реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реБрд▓рдн DOM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рд╕рдВрд╡рд╛рдж рдЪреИрдирд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред

Post Messages

content-script.js
// This is like "chrome.runtime.sendMessage" but to maintain the connection
var port = chrome.runtime.connect();

window.addEventListener("message", (event) => {
// We only accept messages from ourselves
if (event.source !== window) {
return;
}

if (event.data.type && (event.data.type === "FROM_PAGE")) {
console.log("Content script received: " + event.data.text);
// Forward the message to the background script
port.postMessage(event.data.text);
}
}, false);
example.js
document.getElementById("theButton").addEventListener("click", () => {
window.postMessage(
{type : "FROM_PAGE", text : "Hello from the webpage!"}, "*");
}, false);

рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдкреЛрд╕реНрдЯ рд╕рдВрджреЗрд╢ рд╕рдВрдЪрд╛рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рд╕рдВрджреЗрд╢ рдХреА рдкреНрд░рд╛рдорд╛рдгрд┐рдХрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЬрд╛рдВрдЪ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  • event.isTrusted: рдпрд╣ рдХреЗрд╡рд▓ рддрдм рд╕рддреНрдп рд╣реИ рдЬрдм рдШрдЯрдирд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХреА рдЧрдИ рд╣реЛ

  • рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗрд╡рд▓ рддрднреА рд╕рдВрджреЗрд╢ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреА рд╣реИ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреБрдЫ рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ

  • рдЙрддреНрдкрддреНрддрд┐ рдбреЛрдореЗрди: рдХреЗрд╡рд▓ рдбреЛрдореЗрди рдХреА рдЕрдиреБрдорддрд┐ рд╕реВрдЪреА рд╕реЗ рд╕рдВрджреЗрд╢ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреА рд╣реИред

  • рдпрджрд┐ рдПрдХ regex рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ

  • рд╕реНрд░реЛрдд: received_message.source !== window рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢ рдЙрд╕реА рд╡рд┐рдВрдбреЛ рд╕реЗ рдерд╛ рдЬрд╣рд╛рдВ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реБрди рд░рд╣реА рд╣реИред

рдкрд┐рдЫрд▓реА рдЬрд╛рдВрдЪреЗрдВ, рднрд▓реЗ рд╣реА рдХреА рдЧрдИ рд╣реЛрдВ, рдХрдордЬреЛрд░ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреГрд╖реНрда рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдкреЛрд╕реНрдЯ рд╕рдВрджреЗрд╢ рдмрд╛рдпрдкрд╛рд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ:

Iframe

рд╕рдВрдЪрд╛рд░ рдХрд╛ рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХрд╛ Iframe URLs рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдк рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдБ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

DOM

рдпрд╣ "рд╕рдЯреАрдХ" рд╕рдВрдЪрд╛рд░ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗрдм рдФрд░ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╡реЗрдм DOM рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрдЧреАред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕рд╕реЗ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдкрдврд╝ рд░рд╣реА рд╣реИ, рд╡реЗрдм DOM рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реБрдП, рддреЛ рд╡реЗрдм рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рд╡реЗрдм рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗрдм XSS рдХреЗ рдкреНрд░рддрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИ) рдФрд░ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдордЭреМрддрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЖрдк рдПрдХ DOM рдЖрдзрд╛рд░рд┐рдд XSS рд╕реЗ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рд╕рдордЭреМрддрд╛ рдХрд░рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рднреА рдпрд╣рд╛рдБ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ тЖФя╕О рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрдЪрд╛рд░

рдПрдХ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ runtime.sendMessage() рдпрд╛ tabs.sendMessage() рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдПрдХ рдмрд╛рд░ JSON-рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрдмрд▓ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддреА рд╣реИред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реМрдЯрд╛рдП рдЧрдП Promise рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреАрдЫреЗ рдХреА рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрднреА рднреА рдЕрдВрддрд┐рдо рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдХреЙрд▓рдмреИрдХ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

(async () => {
const response = await chrome.runtime.sendMessage({greeting: "hello"});
// do something with response here, not outside the function
console.log(response);
})();

рдПрдХ extension рд╕реЗ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛ (рдЖрдорддреМрд░ рдкрд░ рдПрдХ background script)ред рдЪрдпрдирд┐рдд рдЯреИрдм рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:

// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
(async () => {
const [tab] = await chrome.tabs.query({active: true, lastFocusedWindow: true});
const response = await chrome.tabs.sendMessage(tab.id, {greeting: "hello"});
// do something with response here, not outside the function
console.log(response);
})();

On the receiving end, you need to set up an runtime.onMessage рдЗрд╡реЗрдВрдЯ рд▓рд┐рд╕рдирд░ to handle the message. This looks the same from a content script or extension page.

// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
if (request.greeting === "hello")
sendResponse({farewell: "goodbye"});
}
);

рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛, sendResponse() рдХреЛ рд╕рдордХрд╛рд▓рд┐рдХ рддрд░реАрдХреЗ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред sendResponse() рдХреЗ рдЕрд╕рдордХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП onMessage рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, return true; рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИред

рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЙрди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдХрдИ рдкреГрд╖реНрда onMessage рдЗрд╡реЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП sendResponse() рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рдкреГрд╖реНрда рд╣реА рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдЙрд╕реА рдЗрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдмрд╛рдж рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдирдИ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдирд╛рддреЗ рд╕рдордп, рд╡рд╛рджреЛрдВ рдХреА рдУрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рди рдХрд┐ рдХреЙрд▓рдмреИрдХ рдХреАред рдХреЙрд▓рдмреИрдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, sendResponse() рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рддрднреА рдорд╛рдиреНрдп рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рд╕реАрдзреЗ рд╕рдордХрд╛рд▓рд┐рдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрд╛ рдпрджрд┐ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ true рд▓реМрдЯрд╛рдХрд░ рдЕрд╕рдордХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рднреА рд╣реИрдВрдбрд▓рд░ true рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдпрд╛ рдпрджрд┐ sendResponse() рдлрд╝рдВрдХреНрд╢рди рдореЗрдореЛрд░реА рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЧрд╛рд░рдмреЗрдЬ-рдХрд▓реЗрдХреНрдЯреЗрдб), рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ sendMessage() рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреЙрд▓рдмреИрдХ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдиреЗрдЯреАрд╡ рдореИрд╕реЗрдЬрд┐рдВрдЧ

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдмрд╛рдЗрдирд░реА рдХреЗ рд╕рд╛рде stdin рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рднреА рджреЗрддреЗ рд╣реИрдВред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЗрд╕ рдмрд╛рдд рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ json рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ:

{
"name": "com.my_company.my_application",
"description": "My Application",
"path": "C:\\Program Files\\My Application\\chrome_native_messaging_host.exe",
"type": "stdio",
"allowed_origins": ["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]
}

рдЬрд╣рд╛рдБ name рд╡рд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ рдЬреЛ runtime.connectNative() рдпрд╛ runtime.sendNativeMessage() рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред path рдмрд╛рдЗрдирд░реА рдХрд╛ рдкрде рд╣реИ, рдХреЗрд╡рд▓ 1 рдорд╛рдиреНрдп type рд╣реИ рдЬреЛ stdio рд╣реИ (stdin рдФрд░ stdout рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ) рдФрд░ allowed_origins рдЙрди рдПрдХреНрд╕рдЯреЗрдВрд╢рдиреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ рдЗрд╕рдореЗрдВ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛)ред

Chrome/Chromium рдЗрд╕ json рдХреЛ рдХреБрдЫ рд╡рд┐рдВрдбреЛрдЬ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдФрд░ macOS рдФрд░ Linux рдореЗрдВ рдХреБрдЫ рдкрдереЛрдВ рдореЗрдВ рдЦреЛрдЬреЗрдЧрд╛ (рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП docs рдореЗрдВ рджреЗрдЦреЗрдВ)ред

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдЗрд╕ рд╕рдВрдЪрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП nativeMessaing рдЕрдиреБрдорддрд┐ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдПрдХ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рд╣реИ рдЬреЛ рдПрдХ рдиреЗрдЯрд┐рд╡ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ:

chrome.runtime.sendNativeMessage(
'com.my_company.my_application',
{text: 'Hello'},
function (response) {
console.log('Received ' + response);
}
);

In рдЗрд╕ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ рдПрдХ рдХрдордЬреЛрд░ рдкреИрдЯрд░реНрди рдЬреЛ рдХрд┐ рдиреЗрдЯрд┐рд╡ рдореИрд╕реЗрдЬреЗрд╕ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

  1. рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд▓рд┐рдП рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдкреИрдЯрд░реНрди рд╣реИред

  2. рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ sendMessage рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ postMessage рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред

  3. рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ sendNativeMessage рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдиреЗрдЯрд┐рд╡ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред

  4. рдиреЗрдЯрд┐рд╡ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрджреЗрд╢ рдХреЛ рдЦрддрд░рдирд╛рдХ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рд╣реЛрддрд╛ рд╣реИред

рдФрд░ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдХрд┐рд╕реА рднреА рдкреГрд╖реНрда рд╕реЗ RCE рддрдХ рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдореЗрдореЛрд░реА/рдХреЛрдб/рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдореЗрдВ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА

рдпрджрд┐ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЕрдкрдиреА рдореЗрдореЛрд░реА рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдбрдВрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рдВрдбреЛрдЬ рдорд╢реАрдиреЛрдВ рдореЗрдВ) рдФрд░ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЦреЛрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдореЗрдореЛрд░реА рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдорд╛рдиреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдЬреИрд╕реЗ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдпрд╛ рдореНрдиреЗрдореЛрдирд┐рдХ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рд╕реНрдЯреЛрд░ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред

рдмреЗрд╢рдХ, рдХреЛрдб рдореЗрдВ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рди рдбрд╛рд▓реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реЛрдЧреАред

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдореЗрдореЛрд░реА рдХреЛ рдбрдВрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдкреНрд░реЛрд╕реЗрд╕ рдореЗрдореЛрд░реА рдХреЛ рдбрдВрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП Inspect pop-up рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ -> Memory рд╕реЗрдХреНрд╢рди рдореЗрдВ -> Take a snapshot рдФрд░ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЗ рдЕрдВрджрд░ CTRL+F рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдЬреИрд╕реЗ рдореНрдиреЗрдореЛрдирд┐рдХ рдХреАрдЬрд╝ рдпрд╛ рдкрд╛рд╕рд╡рд░реНрдб рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдореЗрдВ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП (рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЗрд╕реЗ рдХреБрдЫ рд╕реЗрдХрдВрдб рдореЗрдВ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рд╕реЗ рд╣рдЯрд╛ рджреЗрдВ) рдХреНрдпреЛрдВрдХрд┐ рдлрд┐рд░ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВрдЧреАред

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓реЛрдб рдХрд░рдирд╛

  1. рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЕрдирдЬрд╝рд┐рдк рдХрд░реЗрдВ

  2. chrome://extensions/ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ Developer Mode рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░реЗрдВ

  3. Load unpacked рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ

рдлрд╛рдпрд░рдлреЙрдХреНрд╕ рдореЗрдВ рдЖрдк about:debugging#/runtime/this-firefox рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ Load Temporary Add-on рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВред

рд╕реНрдЯреЛрд░ рд╕реЗ рд╕реНрд░реЛрдд рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛

рдПрдХ рдХреНрд░реЛрдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдиреАрдЪреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддреГрдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдФрд░ рдирд┐рд░реНрджреЗрд╢ рджрд┐рдП рдЧрдП рд╣реИрдВред

рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ ZIP рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ

рдПрдХ рдХреНрд░реЛрдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ZIP рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ URL рд╕реЗ ZIP рдлрд╝рд╛рдЗрд▓ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП curl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдлрд┐рд░ ZIP рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдирд┐рдХрд╛рд▓рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣рд╛рдБ рдХрджрдо рд╣реИрдВ:

  1. "extension_id" рдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ ID рд╕реЗ рдмрджрд▓реЗрдВред

  2. рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

extension_id=your_extension_id   # Replace with the actual extension ID
curl -L -o "$extension_id.zip" "https://clients2.google.com/service/update2/crx?response=redirect&os=mac&arch=x86-64&nacl_arch=x86-64&prod=chromecrx&prodchannel=stable&prodversion=44.0.2403.130&x=id%3D$extension_id%26uc"
unzip -d "$extension_id-source" "$extension_id.zip"

CRX Viewer рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

https://robwu.nl/crxviewer/

CRX Viewer рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдПрдХ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд┐рдзрд┐ Chrome Extension Source Viewer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рдПрдХ рдУрдкрди-рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИред рдЗрд╕реЗ Chrome Web Store рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡реНрдпреВрдЕрд░ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдЗрд╕рдХреЗ GitHub repository рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред

рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рд╕реНрд░реЛрдд рджреЗрдЦреЗрдВ

рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд Chrome рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рднреА рдирд┐рд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдпрд╣ рдХреИрд╕реЗ рдХрд░реЗрдВ:

  1. chrome://version/ рдкрд░ рдЬрд╛рдХрд░ рдЕрдкрдиреЗ Chrome рд╕реНрдерд╛рдиреАрдп рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рддрдХ рдкрд╣реБрдБрдЪреЗрдВ рдФрд░ "Profile Path" рдлрд╝реАрд▓реНрдб рдХреЛ рдЦреЛрдЬреЗрдВред

  2. рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рднреАрддрд░ Extensions/ рдЙрдкрдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдЬрд╛рдПрдБред

  3. рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рднреА рд╕реНрдерд╛рдкрд┐рдд рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реЛрддреЗ рд╣реИрдВ, рдЖрдорддреМрд░ рдкрд░ рдЙрдирдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдкрдардиреАрдп рдкреНрд░рд╛рд░реВрдк рдореЗрдВред

рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЙрдирдХреЗ IDs рдХреЛ рдирд╛рдореЛрдВ рд╕реЗ рдореИрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

  • рдкреНрд░рддреНрдпреЗрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ ID рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП about:extensions рдкреГрд╖реНрда рдкрд░ рдбреЗрд╡рд▓рдкрд░ рдореЛрдб рд╕рдХреНрд╖рдо рдХрд░реЗрдВред

  • рдкреНрд░рддреНрдпреЗрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рднреАрддрд░, manifest.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдкрдардиреАрдп name рдлрд╝реАрд▓реНрдб рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИред

рдлрд╝рд╛рдЗрд▓ рдЖрд░реНрдХрд╛рдЗрд╡рд░ рдпрд╛ рдЕрдирдкреИрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

Chrome Web Store рдкрд░ рдЬрд╛рдПрдБ рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред рдлрд╝рд╛рдЗрд▓ рдХрд╛ .crx рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реЛрдЧрд╛ред рдлрд╝рд╛рдЗрд▓ рдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ .crx рд╕реЗ .zip рдореЗрдВ рдмрджрд▓реЗрдВред ZIP рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдлрд╝рд╛рдЗрд▓ рдЖрд░реНрдХрд╛рдЗрд╡рд░ (рдЬреИрд╕реЗ WinRAR, 7-Zip, рдЖрджрд┐) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

Chrome рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

Chrome рдЦреЛрд▓реЗрдВ рдФрд░ chrome://extensions/ рдкрд░ рдЬрд╛рдПрдБред рд╢реАрд░реНрд╖ рджрд╛рдПрдБ рдХреЛрдиреЗ рдореЗрдВ "рдбреЗрд╡рд▓рдкрд░ рдореЛрдб" рд╕рдХреНрд╖рдо рдХрд░реЗрдВред "рд▓реЛрдб рдЕрдирдкреИрдХреНрдб рдПрдХреНрд╕рдЯреЗрдВрд╢рди..." рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рдЕрдкрдиреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ рдЬрд╛рдПрдБред рдпрд╣ рд╕реНрд░реЛрдд рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рдпрд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЧрдП рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред

Chrome рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореИрдирд┐рдлреЗрд╕реНрдЯ рдбреЗрдЯрд╛рд╕реЗрдЯ