Chrome扩展中startsWith匹配当前页面URL不生效问题求解
问题原因
你写的逻辑永远进入else分支、同时存在安全隐患,核心是三个问题:
- 前缀匹配规则写得太死:你判断的固定前缀是
https://swisscom.ch,但实际访问Swisscom官方站点时,根域名会自动跳转到带www的子域名(即https://www.swisscom.ch开头),登录、商城等业务线还会使用login.swisscom.ch、shop.swisscom.ch这类独立子域名,硬写无www的固定前缀自然匹配失败。 - 字符串直接匹配存在钓鱼误判风险:直接对完整URL用
startsWith判断,会把https://swisscom.ch.phish.com这类钓鱼站误判为官方站——这类URL开头确实包含你写的字符串,但实际域名归钓鱼方所有,完全违背安全检测的初衷。 - 额外功能缺陷:你只设置了徽章背景色,没有设置徽章文本,用户根本看不到角标提示,功能没有实际触达。
修复方案
不要直接匹配URL字符串,用原生URL对象解析出域名主体,判断域名是否为Swisscom官方持有(即主域名精确为swisscom.ch,或属于其下的子域名),既覆盖所有官方站点场景,又能拦截钓鱼域名。
修正后的script.js代码如下:
async function checkCurrentPage() { // 获取当前窗口激活的标签页 const [currentTab] = await chrome.tabs.query({ active: true, windowId: chrome.windows.WINDOW_ID_CURRENT }); // 兼容浏览器内部页面(新标签页、扩展管理页等非http/https协议页面) if (!currentTab.url || !currentTab.url.startsWith('http')) { setBadge('?', '#FFA500'); alert('当前为浏览器内部页面,无法检测站点归属'); return; } // 解析URL拿到域名 const pageHost = new URL(currentTab.url).hostname; // 官方站判断规则:主域精确匹配swisscom.ch,或为swisscom.ch的下级子域名 const isOfficial = pageHost === 'swisscom.ch' || pageHost.endsWith('.swisscom.ch'); if (isOfficial) { alert('Dies ist eine gültige Seite der Swisscom (Schweiz) AG.'); setBadge('OK', '#00FF00'); } else { alert('Vorsicht! Dies ist keine Seite der Swisscom (Schweiz) AG. Geben Sie keine Login- oder Bankdaten ein.'); setBadge('!', '#FF0000'); } } // 统一封装徽章设置逻辑 function setBadge(text, bgColor) { chrome.action.setBadgeText({text}); chrome.action.setBadgeBackgroundColor({color: bgColor}); } checkCurrentPage();
你的manifest.json配置已经满足基础检测需求,不需要额外调整,参考配置如下:
{ "name": "SCSAG Security Check", "version": "1.0.0", "description": "Example App", "manifest_version": 3, "author": "alpinebeagle", "action":{ "default_popup": "index.html", "default_title": "Check page status" }, "permissions": [ "tabs" ] }
测试时注意不要在浏览器内置的新标签页、扩展页等内部页面触发检测,打开任意Swisscom官方页面(比如官网首页)再点击扩展图标即可得到正确结果。
内容的提问来源于stack exchange,提问作者Dominik
相关产品推荐
相关产品推荐

