fix: harden extension security and plugin reliability

Address audit findings across background handlers, openers,
plugins, and UI: URL allowlists, XSS reductions, popup lifecycle
fixes, plugin dispose/cleanup, cloud sync hardening, global search
mathjs sandbox, and settings storage fixes.
This commit is contained in:
2026-06-17 10:50:26 +09:30
parent 0e696e0175
commit 8a5424c5a4
70 changed files with 1229 additions and 430 deletions
+14 -6
View File
@@ -509,7 +509,13 @@ function deepFunctionCheck(obj, path = "") {
}
}
function isTrustedMessage(event) {
return event.source === window && event.origin === window.location.origin;
}
window.addEventListener("message", (event) => {
if (!isTrustedMessage(event)) return;
if (event.data.type === "reactFiberRequest") {
const { selector, action, payload, debug, messageId } = event.data;
const fiberInstance = ReactFiber.find(selector, {
@@ -522,12 +528,14 @@ window.addEventListener("message", (event) => {
response = fiberInstance.getState(payload.key);
break;
case "setState":
// Handle both function and object updates
if (payload.updateFn) {
const updateFn = new Function('return ' + payload.updateFn)();
fiberInstance.setState(updateFn);
} else {
if (
payload.updateObject &&
typeof payload.updateObject === "object" &&
!Array.isArray(payload.updateObject)
) {
fiberInstance.setState(payload.updateObject);
} else {
console.warn("[pageState] setState rejected: only plain objects are allowed");
}
response = {};
break;
@@ -580,7 +588,7 @@ window.addEventListener("message", (event) => {
response,
messageId,
},
"*",
window.location.origin,
);
} else if (event.data.type === "triggerKeyboardEvent") {
// Handle keyboard event triggering from content script