Skip to content

Commit 689e769

Browse files
Add url input validation on openlink
1 parent 864354c commit 689e769

1 file changed

Lines changed: 13 additions & 5 deletions

File tree

examples/basic-host/src/implementation.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -344,22 +344,30 @@ export function newAppBridge(
344344
appBridge.onopenlink = async (params, _extra) => {
345345
log.info("Open link request:", params);
346346

347+
let url: URL;
348+
try {
349+
url = new URL(params.url);
350+
} catch {
351+
log.warn("Invalid URL:", params.url);
352+
return { isError: true };
353+
}
354+
347355
const HOST_OPENLINK_DENYLIST = [new URL("https://malicious.com")];
348-
if (HOST_OPENLINK_DENYLIST.some(({ origin }) => origin === new URL(params.url).origin)) {
356+
if (HOST_OPENLINK_DENYLIST.some(({ origin }) => origin === url.origin)) {
349357
log.info("Blocked link by host denylist:", params.url);
350358
return { isError: true };
351359
}
352360

353361
const isTrustedByApp = options?.linkTrustedDomains?.some((trustedDomain) =>
354-
new URLPattern(trustedDomain).test(params.url)
362+
new URLPattern(trustedDomain).test(url)
355363
);
356-
const shouldOpen = isTrustedByApp || window.confirm(`Open external link?\n${params.url}`);
364+
const shouldOpen = isTrustedByApp || window.confirm(`Open external link?\n${url}`);
357365
if (shouldOpen) {
358-
window.open(params.url, "_blank", "noopener,noreferrer");
366+
window.open(url, "_blank", "noopener,noreferrer");
359367
return {};
360368
}
361369

362-
log.info("User declined to open link:", params.url);
370+
log.info("User declined to open link:", url);
363371
return { isError: true };
364372
};
365373

0 commit comments

Comments
 (0)