hacktricks/pentesting-web/browser-extension-pentesting-methodology
2024-04-19 00:32:22 +00:00
..
browext-clickjacking.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/REA 2024-04-07 03:36:12 +00:00
browext-permissions-and-host_permissions.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/REA 2024-04-07 03:36:12 +00:00
browext-xss-example.md Translated to Swahili 2024-02-11 02:13:58 +00:00
README.md Translated ['pentesting-web/browser-extension-pentesting-methodology/REA 2024-04-19 00:32:22 +00:00

Mbinu ya Kupima Usalama wa Kifaa cha Kivinjari

Jifunze kuhusu kuvamia AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Taarifa Msingi

Vifaa vya kivinjari hiviandikwa kwa JavaScript na hulandwa na kivinjari kwa nyuma. Ina DOM yake lakini inaweza kuingiliana na DOM za tovuti nyingine. Hii inamaanisha inaweza kuhatarisha usiri, uadilifu, na upatikanaji wa tovuti nyingine (CIA).

Sehemu Kuu

Muundo wa vifaa vya kivinjari unaonekana vizuri wakati unavyoonyeshwa na una sehemu tatu. Hebu tuangalie kila sehemu kwa undani.

http://webblaze.cs.berkeley.edu/papers/Extensions.pdf

Vifaa vya Maudhui

Kila skripti ya maudhui ina ufikio wa moja kwa moja kwa DOM ya ukurasa wa wavuti mmoja na hivyo inaweza kuwa na ufikio wa matokeo mabaya. Hata hivyo, skripti ya maudhui haina ruhusa nyingine isipokuwa uwezo wa kutuma ujumbe kwa msingi wa kifaa cha kivinjari.

Msingi wa Kifaa cha Kivinjari

Msingi wa kifaa cha kivinjari una ruhusa/upatikanaji mwingi wa kifaa cha kivinjari, lakini msingi wa kifaa cha kivinjari unaweza kuingiliana na maudhui ya wavuti kupitia XMLHttpRequest na skripti za maudhui. Pia, msingi wa kifaa cha kivinjari haujafikia moja kwa moja kwenye kifaa cha mwenyeji.

Binary ya Asili

Kifaa cha kivinjari kuruhusu binary ya asili ambayo inaweza kufikia kifaa cha mwenyeji kwa ruhusa kamili za mtumiaji. Binary ya asili inaingiliana na msingi wa kifaa cha kivinjari kupitia kawaida Netscape Plugin Application Programming Interface (NPAPI) inayotumiwa na Flash na programu-jalizi zingine za kivinjari.

Mipaka

{% hint style="danger" %} Ili kupata ruhusa kamili za mtumiaji, mshambuliaji lazima awashawishi vifaa vya kivinjari kupitisha matokeo mabaya kutoka kwa skripti ya maudhui kwenda kwa msingi wa kifaa cha kivinjari na kutoka kwa msingi wa kifaa cha kivinjari kwenda kwa binary ya asili. {% endhint %}

Kila sehemu ya kifaa cha kivinjari imegawanywa kutoka kwa nyingine kwa mipaka madhubuti ya kinga. Kila sehemu inaendeshwa katika mchakato tofauti wa mfumo wa uendeshaji. Skripti za maudhui na msingi wa kifaa cha kivinjari zinaendeshwa katika mchakato wa mchanga usiopatikana kwa huduma nyingi za mfumo wa uendeshaji.

Zaidi ya hayo, skripti za maudhui zinatenganishwa na kurasa zao za wavuti kwa kuendeshwa katika rundo la JavaScript tofauti. Skripti ya maudhui na ukurasa wa wavuti wana ufikio wa DOM sawa chini, lakini hawabadilishani pointi za JavaScript, kuzuia kuvuja kwa utendaji wa JavaScript.

manifest.json

Kifaa cha kivinjari cha Chrome ni folda ya ZIP tu na faili ya .crx kwenye upanuzi wa faili. Msingi wa kifaa cha kivinjari ni faili ya manifest.json kwenye mizizi ya folda, ambayo inabainisha muundo, ruhusa, na chaguzi nyingine za usanidi.

Mfano:

{
"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

Vipande vya maudhui vinapakia wakati wowote mtumiaji anapoelekea kwenye ukurasa unaofanana, katika kesi yetu ukurasa wowote unaofanana na https://example.com/* na usiofanana na *://*/*/business* regex. Wanatekeleza kama skripti za ukurasa wenyewe na wanayo ufikivu wa ukurasa wa Modeli ya Vitu vya Nyaraka (DOM).

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

Ili kujumuisha au kutoa nje URL zaidi, pia ni rahisi kutumia include_globs na exclude_globs.

Hii ni skripti ya maudhui mfano ambayo itaongeza kitufe cha kuelezea kwenye ukurasa wakati API ya uhifadhi inatumika kuchukua thamani ya message kutoka kwenye uhifadhi wa programu-jalizi.

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);
});

Ujumbe hutumwa kwa kurasa za nyongeza na skripti ya maudhui inapobonyeza kifungo hiki, kupitia matumizi ya API ya runtime.sendMessage(). Hii ni kutokana na kikomo cha skripti ya maudhui katika upatikanaji wa moja kwa moja wa APIs, na storage ikiwa miongoni mwa visa vichache. Kwa utendaji zaidi ya visa hivi, ujumbe hutumwa kwa kurasa za nyongeza ambazo skripti za maudhui zinaweza kuzungumza nazo.

{% hint style="warning" %} Kulingana na kivinjari, uwezo wa skripti ya maudhui unaweza kutofautiana kidogo. Kwa vivinjari vilivyotegemea Chromium, orodha ya uwezo inapatikana katika nyaraka za Chrome Developers, na kwa Firefox, MDN ni chanzo kikuu.
Pia ni muhimu kufahamu kwamba skripti za maudhui zina uwezo wa kuzungumza na skripti za mandharinyuma, kuwawezesha kutekeleza vitendo na kurudisha majibu. {% endhint %}

Kwa kutazama na kudebugi skripti za maudhui kwenye Chrome, menyu ya zana za maendeleo ya Chrome inaweza kupatikana kutoka kwa Chaguo > Zana zaidi > Zana za maendeleo AU kwa kubonyeza Ctrl + Shift + I.

Baada ya zana za maendeleo kuonyeshwa, Kichupo cha Chanzo kinapaswa kubonyezwa, ikifuatiwa na Kichupo cha Skripti za Maudhui. Hii inaruhusu ufuatiliaji wa skripti za maudhui zinazoendeshwa kutoka kwa nyongeza mbalimbali na kuweka vituo vya kusitisha ili kufuatilia mwendelezo wa utekelezaji.

Skripti za maudhui zilizoinjektiwa

{% hint style="success" %} Tambua kwamba Skripti za Maudhui sio lazima kwani pia ni inawezekana kuziinjekta skripti na kuziinjekta kwa njia ya programu kwenye kurasa za wavuti kupitia tabs.executeScript. Hii kimsingi hutoa udhibiti wa kina zaidi. {% endhint %}

Kwa kuingiza kwa njia ya programu skripti ya maudhui, nyongeza inahitajika kuwa na ruhusa ya mwenyeji kwa ukurasa ambao skripti hizo zitaingizwa. Ruhusa hizi zinaweza kulindwa au kwa kuomba ndani ya mizizi ya nyongeza au kwa muda kupitia activeTab.

Mfano wa nyongeza inayotegemea activeTab

{% code title="manifest.json" %}

{
"name": "My extension",
...
"permissions": [
"activeTab",
"scripting"
],
"background": {
"service_worker": "background.js"
},
"action": {
"default_title": "Action Button"
}
}

{% endcode %}

  • Ingiza faili ya JS kwa kubofya:
// 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"]
});
});
  • Ingiza kazi kwa kubofya:
//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,
});
});

Mfano na ruhusa za kutekeleza maandishi

// 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" });

Ili kujumuisha au kutojumuisha URL zaidi, pia ni rahisi kutumia include_globs na exclude_globs.

Skripti za Yaliyomo run_at

Uwanja wa run_at unadhibiti wakati faili za JavaScript zinaingizwa kwenye ukurasa wa wavuti. Thamani iliyopendelewa na ya msingi ni "document_idle".

Thamani zinazowezekana ni:

  • document_idle: Wakati wowote inapowezekana
  • document_start: Baada ya faili yoyote kutoka css, lakini kabla ya DOM nyingine yoyote kujengwa au skripti nyingine yoyote kutekelezwa.
  • document_end: Mara tu baada ya DOM kukamilika, lakini kabla ya rasilimali zingine kama picha na fremu kupakia.

Kupitia manifest.json

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

Kupitia service-worker.js

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

background

Ujumbe uliotumwa na skripti za maudhui unapokelewa na ukurasa wa nyuma, ambao unacheza jukumu muhimu katika kuratibu sehemu za nyongeza. Hasa, ukurasa wa nyuma unaendelea kwa muda wote wa maisha ya nyongeza, ukiendesha kwa siri bila ushirikiano moja kwa moja na mtumiaji. Una uwezo wa kuwa na Modeli ya Vitu ya Nyaraka (DOM) yake, kuruhusu mwingiliano na usimamizi wa hali wa kina.

Muhimu:

  • Jukumu la Ukurasa wa Nyuma: Hufanya kama kitovu cha fahamu kwa nyongeza, kuhakikisha mawasiliano na uratibu kati ya sehemu mbalimbali za nyongeza.
  • Udumu: Ni kiumbe kilichopo daima, kisichoonekana na mtumiaji lakini muhimu kwa utendaji wa nyongeza.
  • Uzalishaji wa Kiotomatiki: Ikiwa haijatamkwa wazi, kivinjari kitaunda ukurasa wa nyuma kiotomatiki. Ukurasa huu uliozalishwa kiotomatiki utajumuisha skripti zote za nyuma zilizotajwa katika maelezo ya nyongeza, kuhakikisha utendaji laini wa kazi za nyuma za nyongeza.

{% hint style="success" %} Urahisi uliotolewa na kivinjari katika kuzalisha kiotomatiki ukurasa wa nyuma (isiyotamkwa wazi) huhakikisha kuwa skripti zote muhimu za nyuma zimejumuishwa na zinafanya kazi, kupunguza mchakato wa usanidi wa nyongeza. {% endhint %}

Mfano wa skripti ya nyuma:

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

Inatumia runtime.onMessage API kusikiliza ujumbe. Wakati ujumbe wa "eleza" unapopokelewa, inatumia tabs API kufungua ukurasa kwenye kichupo kipya.

Kwa kudebug skripti ya nyuma unaweza kwenda kwenye maelezo ya nyongeza na kuchunguza mfanyakazi wa huduma, hii itafungua zana za maendeleo na skripti ya nyuma:

Kurasa za Chaguo na Nyingine

Nyongeza za kivinjari zinaweza kuwa na aina mbalimbali za kurasa:

  • Kurasa za Hatua huonyeshwa katika menyu ya kunjua wakati ikoni ya nyongeza inapobofywa.
  • Kurasa ambazo nyongeza ita fungua kwenye kichupo kipya.
  • Kurasa za Chaguo: Ukurasa huu huonyeshwa juu ya nyongeza unapobofya. Katika maelezo ya awali Katika kesi yangu niliweza kufikia ukurasa huu kwa chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca au kwa kubofya:

Tambua kuwa kurasa hizi si thabiti kama kurasa za nyuma kwani huload maudhui kwa lazima. Hata hivyo, zina uwezo fulani sawa na ukurasa wa nyuma:

  • Mawasiliano na Skripti za Yaliyomo: Kama ukurasa wa nyuma, kurasa hizi zinaweza kupokea ujumbe kutoka kwa skripti za yaliyomo, kurahisisha mwingiliano ndani ya nyongeza.
  • Upatikanaji wa APIs Maalum ya Nyongeza: Kurasa hizi zina upatikanaji kamili wa APIs maalum ya nyongeza, chini ya idhini zilizofafanuliwa kwa nyongeza.

permissions & host_permissions

permissions na host_permissions ni vipengele kutoka kwenye manifest.json ambavyo vitabainisha idhini zipi nyongeza ya kivinjari inayo (kama uhifadhi, eneo...) na kwenye kurasa za wavuti zipi.

Kwa kuwa nyongeza za kivinjari zinaweza kuwa zenye mamlaka, moja inayoweza kuwa na nia mbaya au kuchukuliwa na mtu mwingine inaweza kuruhusu muhusika njia tofauti za kuiba taarifa nyeti na kumpeleleza mtumiaji.

Angalia jinsi mipangilio hii inavyofanya kazi na jinsi inavyoweza kutumiwa vibaya katika:

{% content-ref url="browext-permissions-and-host_permissions.md" %} browext-permissions-and-host_permissions.md {% endcontent-ref %}

content_security_policy

Sera ya usalama wa maudhui inaweza kutangazwa pia ndani ya manifest.json. Ikiwa imefafanuliwa, inaweza kuwa dhaifu.

Mipangilio ya msingi kwa kurasa za nyongeza za kivinjari ni ya kizuizi:

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

Kwa habari zaidi kuhusu CSP na njia za kuepuka angalia:

{% content-ref url="../content-security-policy-csp-bypass/" %} content-security-policy-csp-bypass {% endcontent-ref %}

web_accessible_resources

ili kuruhusu ukurasa wa wavuti kupata ukurasa wa Kifaa cha Kivinjari, kama ukurasa wa .html, ukurasa huu unahitaji kutajwa katika uga wa web_accessible_resources wa manifest.json.
Kwa mfano:

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

Kurasa hizi zinapatikana kwa URL kama:

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

Katika vifaa vya umma kitambulisho cha nyongeza kinapatikana:

Hata hivyo, ikiwa parameter ya manifest.json tumia_dynamic_url inatumika, hii kitambulisho inaweza kuwa ya kudumu.

Kuruhusu upatikanaji wa kurasa hizi kunafanya kurasa hizi ziwe hatarini kwa ClickJacking:

{% content-ref url="browext-clickjacking.md" %} browext-clickjacking.md {% endcontent-ref %}

{% hint style="success" %} Kuruhusu kurasa hizi kupakia tu na nyongeza na sio na URL za kubahatisha inaweza kuzuia mashambulizi ya ClickJacking. {% endhint %}

externally_connectable

Kulingana na nyaraka, Mali ya mpangilio wa "externally_connectable" inatangaza ni nyongeza na kurasa za wavuti zipi zinaweza kuunganisha na nyongeza yako kupitia runtime.connect na runtime.sendMessage.

  • Ikiwa ufunguo wa externally_connectable haujatangazwa katika mpangilio wa nyongeza yako au umetangazwa kama "ids": ["*"], nyongeza zote zinaweza kuunganisha, lakini hakuna kurasa za wavuti zinaweza kuunganisha.
  • Ikiwa vitambulisho maalum vimebainishwa, kama katika "ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"], maombi hayo pekee yanaweza kuunganisha.
  • Ikiwa vilinganishi vimebainishwa, programu hizo za wavuti zitaweza kuunganisha:
"matches": [
"https://*.google.com/*",
"*://*.chromium.org/*",
  • Ikiwa imeelezwa kama tupu: "externally_connectable": {}, hakuna programu au wavuti itakayoweza kuunganisha.

Kiwango kidogo cha nyongeza na URL kilichotajwa hapa, eneo dogo la shambulio litakuwa.

{% hint style="danger" %} Ikiwa ukurasa wa wavuti unaobanika kwa XSS au kuchukuliwa umeonyeshwa katika externally_connectable, mkaidi ataweza kupeleka ujumbe moja kwa moja kwa skrini ya nyuma, akizidisha kabisa Skripti ya Yaliyomo na CSP yake.

Kwa hivyo, hii ni njia yenye nguvu sana ya kuepuka.

Zaidi ya hayo, ikiwa mteja anainstall nyongeza ya kijivu, hata kama haimruhusu kuwasiliana na nyongeza inayoweza kubanika, inaweza kuingiza data ya XSS katika ukurasa wa wavuti ulioruhusiwa au kutumia WebRequest au DeclarativeNetRequest APIs kudanganya maombi kwenye kikoa kilicholengwa kubadilisha ombi la ukurasa kwa faili ya JavaScript. (Tambua kuwa CSP kwenye ukurasa uliolengwa inaweza kuzuia mashambulizi haya). Wazo hili linatoka kutoka kwa andiko hili. {% endhint %}

Mawasiliano ya Wavuti ↔︎ Skripti ya Yaliyomo

Mazingira ambapo skripti za yaliyomo hufanya kazi na ambapo kurasa za mwenyeji zipo zime tengwa kutoka kwa nyingine, kuhakikisha kutengwa. Licha ya kutengwa huku, zote mbili zina uwezo wa kuingiliana na Modeli ya Vitu vya Nyaraka (DOM) ya ukurasa, rasilimali inayoshirikiwa. Ili ukurasa wa mwenyeji kushiriki mawasiliano na skripti ya yaliyomo, au kwa njia isiyo ya moja kwa moja na nyongeza kupitia skripti ya yaliyomo, inahitajika kutumia DOM inayopatikana na pande zote kama njia ya mawasiliano.

Ujumbe wa Posta

{% code title="skripti-ya-yaliyomo.js" %}

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);
port.postMessage(event.data.text);
}
}, false);

{% endcode %}

{% code title="example.js" %}

document.getElementById("theButton").addEventListener("click", () => {
window.postMessage(
{type : "FROM_PAGE", text : "Hello from the webpage!"}, "*");
}, false);

{% endcode %}

Mawasiliano salama ya Ujumbe wa Post inapaswa kuhakiki uhalali wa ujumbe uliopokelewa, hii inaweza kufanywa kwa kuchunguza:

  • event.isTrusted: Hii ni Kweli tu ikiwa tukio lilichochochewa na hatua ya mtumiaji
  • Script ya maudhui inaweza kutarajia ujumbe tu ikiwa mtumiaji anafanya kitendo fulani
  • Kikoa cha asili: inaweza kutarajia ujumbe tu kutoka kwa orodha ya kikoa.
  • Ikiwa regex inatumika, kuwa mwangalifu sana
  • Chanzo: received_message.source !== window inaweza kutumika kuangalia ikiwa ujumbe ulitoka kwa dirisha sawa ambapo Script ya Maudhui inasikiliza.

Uchunguzi uliopita, hata kama umefanywa, unaweza kuwa na mapungufu, kwa hivyo hakikisha ukague kwenye ukurasa ufuatao mambo yanayoweza kusababisha kukiuka Ujumbe wa Post:

{% content-ref url="../postmessage-vulnerabilities/" %} postmessage-vulnerabilities {% endcontent-ref %}

Iframe

Njia nyingine inayowezekana ya mawasiliano inaweza kuwa kupitia URL za Iframe, unaweza kupata mfano katika:

{% content-ref url="browext-xss-example.md" %} browext-xss-example.md {% endcontent-ref %}

DOM

Hii sio njia "halisi" ya mawasiliano, lakini mtandao na script ya maudhui itakuwa na ufikivu wa DOM ya wavuti. Kwa hivyo, ikiwa script ya maudhui inasoma habari fulani kutoka kwake, kuiamini DOM ya wavuti, wavuti inaweza kurekebisha data hii (kwa sababu wavuti haipaswi kuaminiwa, au kwa sababu wavuti inaweza kuwa na udhaifu wa XSS) na kuathiri Script ya Maudhui.

Unaweza pia kupata mfano wa DOM based XSS kwa kudhoofisha kivinjari cha nyongeza katika:

{% content-ref url="browext-xss-example.md" %} browext-xss-example.md {% endcontent-ref %}

Taarifa Nyeti kwenye Kumbukumbu/Kificho

Ikiwa Kivinjari cha Nyongeza kinasitiri taarifa nyeti ndani ya kumbukumbu yake, hii inaweza kudondoshwa (hasa kwenye mashine za Windows) na kutafutwa kwa habari hii.

Kwa hivyo, kumbukumbu ya Kivinjari cha Nyongeza haipaswi kuchukuliwa kuwa salama na taarifa nyeti kama vibali au maneno ya kumbukumbu haipaswi kuhifadhiwa.

Bila shaka, usitie taarifa nyeti kwenye kificho, kwani itakuwa wazi.

Kudondosha kumbukumbu kutoka kwa kivinjari unaweza kudondosha kumbukumbu ya mchakato au kwenda kwa vipimo vya nyongeza ya kivinjari bonyeza Angalia pop-up -> Katika sehemu ya Kumbukumbu -> Chukua picha na CTRL+F kutafuta ndani ya picha kwa habari nyeti.

Script ya Maudhui ↔︎ Mawasiliano ya Script ya Msingi

Script ya Maudhui inaweza kutumia kazi runtime.sendMessage() au tabs.sendMessage() kutuma ujumbe wa JSON-serializable mara moja.

Kushughulikia jibu, tumia Ahadi iliyorudishwa. Ingawa, kwa sababu ya utangamano wa nyuma, bado unaweza kupitisha callback kama hoja ya mwisho.

Kutuma ombi kutoka kwa script ya maudhui inaonekana kama hivi:

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

Kutuma ombi kutoka kwa urefushaji (kawaida skripti ya msingi) Skripti ya Yaliyomo inaweza kutumia kazi, isipokuwa unahitaji kufafanua ni kichupo gani cha kutuma. Mfano wa jinsi ya kutuma ujumbe kwa skripti ya yaliyomo kwenye kichupo kilichochaguliwa:

// 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);
})();

Kwenye mwisho wa kupokea, unahitaji kuweka runtime.onMessage msikilizaji wa tukio kushughulikia ujumbe. Hii inaonekana sawa kutoka kwa skripti ya maudhui au ukurasa wa nyongeza.

// 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"});
}
);

Katika mfano ulioonyeshwa, sendResponse() ilitumika kwa njia ya kusawazisha. Ili kurekebisha kipande cha matukio cha onMessage kwa utekelezaji wa kusubiri wa sendResponse(), ni muhimu kujumuisha return true;.

Uzingatiaji muhimu ni kwamba katika hali ambapo kurasa kadhaa zimewekwa kupokea matukio ya onMessage, ukurasa wa kwanza kutekeleza sendResponse() kwa tukio maalum ndio pekee utakaoweza kutoa jibu kwa ufanisi. Majibu yoyote yanayofuata kwa tukio hilo hilo hayatazingatiwa.

Wakati wa kutengeneza nyongeza mpya, upendeleo unapaswa kuwa kwa ahadi badala ya maombi ya kurudi. Kuhusu matumizi ya maombi ya kurudi, kazi ya sendResponse() inachukuliwa kuwa halali tu ikiwa itatekelezwa moja kwa moja ndani ya muktadha wa kusawazisha, au ikiwa kipande cha matukio kinaonyesha operesheni ya kusubiri kwa kurudi true. Ikiwa hakuna moja ya wachakataji itarudisha true au ikiwa kazi ya sendResponse() itaondolewa kutoka kumbukumbu (garbage-collected), maombi yanayohusiana na kazi ya sendMessage() yatachochewa kwa chaguo-msingi.

Kupakia Nyongeza kwenye Kivinjari

  1. Pakua Nyongeza ya Kivinjari & fanya upakuaji wa faili
  2. Nenda kwenye chrome://extensions/ na wezesha Mode ya Mwendelezi
  3. Bonyeza kitufe cha Pakia bila kufunga

Kwenye Firefox nenda kwenye about:debugging#/runtime/this-firefox na bonyeza kitufe cha Pakia Nyongeza ya Muda.

Kupata msimbo wa chanzo kutoka dukani

Msimbo wa chanzo wa nyongeza ya Chrome unaweza kupatikana kupitia njia mbalimbali. Hapa chini kuna maelezo ya kina na maelekezo kwa kila chaguo.

Pakua Nyongeza kama ZIP kupitia Mstari wa Amri

Msimbo wa chanzo wa nyongeza ya Chrome unaweza kupakuliwa kama faili ya ZIP kwa kutumia mstari wa amri. Hii inahusisha kutumia curl kupata faili ya ZIP kutoka kwenye URL maalum na kisha kuchambua yaliyomo ya faili ya ZIP kwenye saraka. Hapa kuna hatua:

  1. Badilisha "extension_id" na Kitambulisho halisi cha nyongeza.
  2. Tekeleza amri zifuatazo:
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"

Tumia tovuti ya CRX Viewer

https://robwu.nl/crxviewer/

Tumia kifaa cha CRX Viewer

Njia nyingine rahisi ni kutumia Chrome Extension Source Viewer, ambayo ni mradi wa chanzo wazi. Inaweza kusakinishwa kutoka kwenye Duka la Wavuti la Chrome. Msimbo wa chanzo wa mtazamaji upo katika repo ya GitHub.

Tazama chanzo cha kifaa cha upanuzi kilichosakinishwa kwa kifaa chako

Vifaa vya Chrome vilivyosakinishwa kwa kifaa chako vinaweza pia kuchunguzwa. Hapa kuna jinsi:

  1. Fikia saraka yako ya wasifu wa ndani ya Chrome kwa kutembelea chrome://version/ na kutafuta uga wa "Profile Path".
  2. Nenda kwenye saraka ya Extensions/ ndani ya saraka ya wasifu.
  3. Saraka hii ina vifaa vyote vilivyosakinishwa, kawaida na msimbo wao wa chanzo katika muundo unaoeleweka.

Ili kutambua vifaa vya upanuzi, unaweza kulinganisha Vitambulisho vyao na majina:

  • Wezesha Mode ya Developer kwenye ukurasa wa about:extensions kuona Vitambulisho vya kila kifaa cha upanuzi.
  • Ndani ya saraka ya kila kifaa cha upanuzi, faili ya manifest.json ina uga wa kusomeka wa name, kukusaidia kutambua kifaa cha upanuzi.

Tumia Archiver au Unpacker wa Faili

Nenda kwenye Duka la Wavuti la Chrome na pakua kifaa cha upanuzi. Faili itakuwa na kificho cha .crx. Badilisha kificho cha faili kutoka .crx hadi .zip. Tumia archiver yoyote ya faili (kama WinRAR, 7-Zip, n.k.) kutoa maudhui ya faili ya ZIP.

Tumia Mode ya Developer kwenye Chrome

Fungua Chrome na nenda kwenye chrome://extensions/. Wezesha "Mode ya Developer" juu kulia. Bonyeza "Load unpacked extension...". Nenda kwenye saraka ya kifaa chako cha upanuzi. Hii haitoi msimbo wa chanzo, lakini ni muhimu kwa kutazama na kurekebisha msimbo wa kifaa cha upanuzi ulioshushwa au ulioendelezwa tayari.