├── Heimdallr ├── background.js ├── manifest.json └── resource │ ├── data │ └── data.js │ ├── img │ └── icon │ │ └── ico.png │ ├── inject │ ├── content.js │ └── inject.js │ └── popup │ ├── assets │ ├── index.39d51c0c.js │ └── index.83b47678.css │ ├── ico.png │ └── index.html ├── Heimdallr程序逻辑.png ├── LICENSE ├── README.assets ├── 404logo.png ├── image-20220814220214770.png ├── image-20220818000347564.png ├── image-20221017093032294.png ├── image-20221017154419189.png ├── image-20221017154934546.png └── image-20221104111153079.png ├── README.md └── Vue_popup └── heimdallr_v3 ├── README.md ├── index.html ├── package-lock.json ├── package.json ├── public └── ico.png ├── src ├── App.vue ├── assets │ └── ico.png └── main.js └── vite.config.js /Heimdallr/background.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | importScripts("resource/data/data.js") 4 | 5 | var HConfig = null 6 | // 默认配置 {currentTabs: -999, "noPageCache" : true, "blockHoneypot" : false, "responseCheck" : false, "pluginStart" : true, "webRtcSettingModify" : false, "canvasInject": false}} 7 | 8 | var HSniffList = null 9 | // element结构 tabId : {shost:"www.baidu.com", sresult:[{sid: 1, scontent: "test123"},{sid: 2, scontent: "test123"}}]} 10 | 11 | var debuggerAttach = null 12 | // {attachingTab: -999, attachingContent: {}} 13 | 14 | var oldConfig = null 15 | // 通过旧config变量控制popup修改配置后的行为 16 | 17 | var lastUpdate = null 18 | // 补充当前页面为chrome相关页面时的行为操作 19 | 20 | // 清除配置缓存 21 | // chrome.storage.local.set({HConfig: null}, function() {}) 22 | 23 | try { 24 | 25 | // 首次安装时弹出设置 26 | if (!chrome.runtime.onInstalled.hasListener(runtimeOnInstallListener)){ 27 | chrome.runtime.onInstalled.addListener(runtimeOnInstallListener) 28 | } else { 29 | console.log("runtimeOnInstallListener is Listening") 30 | } 31 | 32 | function runtimeOnInstallListener(details){ 33 | if (details.reason=="install") { 34 | chrome.runtime.openOptionsPage() 35 | } 36 | } 37 | 38 | 39 | 40 | 41 | 42 | keepServiceRunning() 43 | Init() 44 | 45 | 46 | 47 | 48 | 49 | function keepServiceRunning() { 50 | setTimeout(function () {console.log(HSniffList)}, 300000) 51 | } 52 | 53 | function Init() { 54 | initConfig() 55 | // 顺序执行 initMonitor()、checkSelectFunction() 56 | initData() 57 | } 58 | 59 | 60 | 61 | 62 | 63 | function initConfig(){ 64 | chrome.action.setBadgeBackgroundColor({color: "#107c10"}) 65 | 66 | debuggerAttach = {attachingTab: -999, attachingContent: {}} 67 | lastUpdate = {url: "", tab: -999, chrome: false} 68 | 69 | chrome.storage.local.get(['HConfig'], function(webstorage) { 70 | chrome.tabs.query({currentWindow: true, active: true}, function(tabArray) { 71 | if (webstorage.HConfig != null){ 72 | HConfig = webstorage.HConfig 73 | } else { 74 | HConfig = {currentTabs: -999, "noPageCache" : true, "blockHoneypot" : false, "responseCheck" : false, "pluginStart" : true, "webRtcSettingModify" : false, "canvasInject": false} 75 | } 76 | if (tabArray[0] != null && tabArray[0].id != null ){ 77 | HConfig.currentTabs = tabArray[0].id 78 | } 79 | oldConfig = Object.assign({}, HConfig) 80 | chrome.storage.local.set({HConfig: HConfig}, function() {}) 81 | 82 | 83 | console.log("初始化配置数据"); 84 | console.log(HConfig); 85 | console.log(webstorage); 86 | 87 | 88 | initMonitor() 89 | // 选项类功能检查是否启用 90 | // checkSelectFunction() 91 | }) 92 | }) 93 | } 94 | 95 | function initData(){ 96 | chrome.storage.local.get(['HSniffList'], function(webstorage) { 97 | if (webstorage.HSniffList != null){ 98 | HSniffList = webstorage.HSniffList 99 | } else { 100 | HSniffList = {} 101 | chrome.storage.local.set({HSniffList: HSniffList}, function() {}) 102 | } 103 | }) 104 | } 105 | 106 | function checkSelectFunction(){ 107 | // 用于判断选项功能是否生效并进行整理 108 | // 插件正常使用时根据设置检查是否预期执行 109 | // 插件关闭时,webRTC功能不变,页面无缓存(其他函数实现)、响应体拦截(其他函数实现)、蜜罐拦截、canvas脚本注入均暂停执行 110 | if (HConfig.pluginStart == true){ 111 | if (HConfig.blockHoneypot == true) { 112 | chrome.declarativeNetRequest.getDynamicRules(function(currentRules){ 113 | if (currentRules.length == 0) { 114 | chrome.declarativeNetRequest.updateDynamicRules( {"addRules" : HBlockingDomainRules, "removeRuleIds" : [] }, function(){console.log("动态添加Blocking规则")}) 115 | } else { 116 | console.log("添加失败,Blocking规则已存在") 117 | } 118 | }) 119 | } else { 120 | chrome.declarativeNetRequest.getDynamicRules(function(currentRules){ 121 | if (currentRules.length != 0) { 122 | let removeNumberArray = Array.from(new Array(currentRules.length+1).keys()).slice(1) 123 | chrome.declarativeNetRequest.updateDynamicRules( {"addRules" : [], "removeRuleIds" : removeNumberArray }, function(){console.log("动态删除Blocking规则")}) 124 | } else { 125 | console.log("无需删除,Blocking规则不存在") 126 | } 127 | }) 128 | } 129 | if (HConfig.webRtcSettingModify == true){ 130 | chrome.privacy.network.webRTCIPHandlingPolicy.get({},function(details){ 131 | if (details.value != "disable_non_proxied_udp") { 132 | console.log("WebRTC策略为默认,1提高为disable_non_proxied_udp") 133 | chrome.privacy.network.webRTCIPHandlingPolicy.set({ 134 | value: 'disable_non_proxied_udp' 135 | }) 136 | } 137 | }) 138 | } else { 139 | chrome.privacy.network.webRTCIPHandlingPolicy.get({},function(details){ 140 | if (details.value == "disable_non_proxied_udp") { 141 | console.log("WebRTC策略为高,1降为默认") 142 | chrome.privacy.network.webRTCIPHandlingPolicy.set({ 143 | value: 'default' 144 | }) 145 | } 146 | }) 147 | } 148 | if (HConfig.canvasInject == true){ 149 | chrome.scripting.getRegisteredContentScripts(function(injectContentScript){ 150 | if (injectContentScript != null && injectContentScript.length == 0){ 151 | chrome.scripting.registerContentScripts([{"allFrames":true, "id":"HInject", "js":["resource/inject/inject.js"], "runAt":"document_start", "matches":["http://*/*","https://*/*","file://*/*"]}], function(){ 152 | console.log("注册Content Script: Canvas interference") 153 | }) 154 | } 155 | }) 156 | } else { 157 | chrome.scripting.getRegisteredContentScripts(function(injectContentScript){ 158 | if (injectContentScript != null && injectContentScript.length != 0){ 159 | chrome.scripting.unregisterContentScripts({"ids":["HInject"]},function(){ 160 | console.log("卸载Content Script: Canvas interference") 161 | }) 162 | } 163 | }) 164 | } 165 | } else { 166 | // 插件关闭,蜜罐拦截功能随之关闭,但配置仍然为true 167 | if (HConfig.blockHoneypot == true) { 168 | chrome.declarativeNetRequest.getDynamicRules(function(currentRules){ 169 | if (currentRules.length != 0) { 170 | let removeNumberArray = Array.from(new Array(currentRules.length+1).keys()).slice(1) 171 | chrome.declarativeNetRequest.updateDynamicRules( {"addRules" : [], "removeRuleIds" : removeNumberArray }, function(){console.log("动态删除Blocking规则")}) 172 | } else { 173 | console.log("无需删除,Blocking规则不存在") 174 | } 175 | }) 176 | } 177 | // 插件关闭,webRTC功能不变 178 | // 插件关闭,canvas脚本注入随之关闭,但配置仍然为true 179 | if (HConfig.canvasInject == true){ 180 | chrome.scripting.getRegisteredContentScripts(function(injectContentScript){ 181 | if (injectContentScript != null && injectContentScript.length != 0){ 182 | chrome.scripting.unregisterContentScripts({"ids":["HInject"]},function(){ 183 | console.log("卸载Content Script: Canvas interference") 184 | }) 185 | } 186 | }) 187 | } 188 | } 189 | } 190 | 191 | function initMonitor(){ 192 | // 工具杂项-安装插件时弹出设置、存储监听器 193 | initToolsMonitor() 194 | // tabs 变更逻辑 195 | initTabsMonitor() 196 | // position 监听器 197 | if (HConfig.pluginStart == true){ 198 | initCheckMonitor() 199 | } 200 | } 201 | 202 | function initToolsMonitor() { 203 | // storage监听器 204 | // 监听扫描结果变更事件和配置更改事件 205 | if (!chrome.storage.onChanged.hasListener(storageOnChangedListener)){ 206 | chrome.storage.onChanged.addListener(storageOnChangedListener) 207 | } else { 208 | console.log("storageOnChangedListener is Listening") 209 | } 210 | 211 | //关闭时删除历史结果 212 | chrome.windows.onRemoved.addListener(function (lastWindowId) { 213 | chrome.windows.getAll(function (windowsList) { 214 | if (windowsList != null && windowsList.length == 0) { 215 | HSniffList = {} 216 | chrome.storage.local.set({HSniffList: HSniffList}, function() {}) 217 | } 218 | }) 219 | }) 220 | } 221 | 222 | function storageOnChangedListener(changes, areaname) { 223 | console.log("storage 变更"); 224 | console.log(changes); 225 | 226 | if (changes.HSniffList !=null){ 227 | // 当前页面结果变更后更新序号 228 | if (changes.HSniffList.newValue["H"+HConfig.currentTabs] != null && changes.HSniffList.newValue["H"+HConfig.currentTabs].sresult.length != 0){ 229 | chrome.action.setBadgeText({text: changes.HSniffList.newValue["H"+HConfig.currentTabs].sresult.length.toString()}) 230 | } else { 231 | chrome.action.setBadgeText({text: ""}) 232 | } 233 | HSniffList = changes.HSniffList.newValue 234 | } else if (changes.HConfig != null){ 235 | // 设置变更 236 | if (JSON.stringify(changes.HConfig.newValue) != JSON.stringify(oldConfig)) { 237 | // 前端引起的设置变更(currentTabs除外) 238 | if (changes.HConfig.newValue.currentTabs != null && changes.HConfig.newValue.currentTabs != oldConfig.currentTabs){ 239 | // 当前页面变更 240 | if (HSniffList["H"+changes.HConfig.newValue.currentTabs] != null && HSniffList["H"+changes.HConfig.newValue.currentTabs].sresult.length != 0){ 241 | chrome.action.setBadgeText({text: HSniffList["H"+changes.HConfig.newValue.currentTabs].sresult.length.toString()}) 242 | } else { 243 | chrome.action.setBadgeText({text: ""}) 244 | } 245 | HConfig = changes.HConfig.newValue 246 | oldConfig = Object.assign({}, HConfig) 247 | } else if (changes.HConfig.newValue.pluginStart != oldConfig.pluginStart){ 248 | // 插件开关 249 | // 先修改设置供函数调用 250 | HConfig = changes.HConfig.newValue 251 | oldConfig = Object.assign({}, HConfig) 252 | if (changes.HConfig.newValue.pluginStart == true){ 253 | // 开启插件 254 | initCheckMonitor() 255 | } else { 256 | // 暂停插件 257 | deleteCheckMonitor() 258 | } 259 | } else if (changes.HConfig.newValue.responseCheck != oldConfig.responseCheck){ 260 | // body匹配 261 | HConfig = changes.HConfig.newValue 262 | oldConfig = Object.assign({}, HConfig) 263 | setResponseCheckListener() 264 | } else if (changes.HConfig.newValue.noPageCache != oldConfig.noPageCache){ 265 | // 缓存设置 266 | // 仅同步全局变量供tabsOnUpdatedListener和tabsOnActiveChangeListener使用 267 | if (changes.HConfig.newValue.noPageCache == true){ 268 | chrome.browsingData.removeCache({"since": ((new Date()).getTime() - 3600000)},function(){}) 269 | } 270 | HConfig = changes.HConfig.newValue 271 | oldConfig = Object.assign({}, HConfig) 272 | } else if (changes.HConfig.newValue.blockHoneypot != oldConfig.blockHoneypot){ 273 | // 蜜罐拦截开关 274 | if (changes.HConfig.newValue.blockHoneypot == true){ 275 | // 开启拦截 276 | chrome.declarativeNetRequest.getDynamicRules(function(currentRules){ 277 | if (currentRules.length == 0) { 278 | chrome.declarativeNetRequest.updateDynamicRules( {"addRules" : HBlockingDomainRules, "removeRuleIds" : [] }, function(){console.log("动态添加Blocking规则")}) 279 | } else { 280 | console.log("添加失败,Blocking规则已存在") 281 | } 282 | }) 283 | } else { 284 | // 暂停拦截 285 | chrome.declarativeNetRequest.getDynamicRules(function(currentRules){ 286 | if (currentRules.length != 0) { 287 | let removeNumberArray = Array.from(new Array(currentRules.length+1).keys()).slice(1) 288 | chrome.declarativeNetRequest.updateDynamicRules( {"addRules" : [], "removeRuleIds" : removeNumberArray }, function(){console.log("动态删除Blocking规则")}) 289 | } else { 290 | console.log("无需删除,Blocking规则不存在") 291 | } 292 | }) 293 | } 294 | HConfig = changes.HConfig.newValue 295 | oldConfig = Object.assign({}, HConfig) 296 | } else if (changes.HConfig.newValue.webRtcSettingModify != oldConfig.webRtcSettingModify){ 297 | // WebRTC设置开关 298 | if (changes.HConfig.newValue.webRtcSettingModify == true){ 299 | // 开启严格策略 300 | chrome.privacy.network.webRTCIPHandlingPolicy.get({},function(details){ 301 | if (details.value != "disable_non_proxied_udp") { 302 | console.log("WebRTC策略为默认,2提高为disable_non_proxied_udp") 303 | chrome.privacy.network.webRTCIPHandlingPolicy.set({ 304 | value: 'disable_non_proxied_udp' 305 | }) 306 | } 307 | }) 308 | } else { 309 | // 关闭严格策略 310 | chrome.privacy.network.webRTCIPHandlingPolicy.get({},function(details){ 311 | if (details.value == "disable_non_proxied_udp") { 312 | console.log("WebRTC策略为高,2降为默认") 313 | chrome.privacy.network.webRTCIPHandlingPolicy.set({ 314 | value: 'default' 315 | }) 316 | } 317 | }) 318 | } 319 | HConfig = changes.HConfig.newValue 320 | oldConfig = Object.assign({}, HConfig) 321 | } else if (changes.HConfig.newValue.canvasInject != oldConfig.canvasInject){ 322 | // canvas干扰开关 323 | if (changes.HConfig.newValue.canvasInject == true){ 324 | // 开启脚本注入 325 | chrome.scripting.registerContentScripts([{"allFrames":true, "id":"HInject", "js":["resource/inject/inject.js"], "runAt":"document_start", "matches":["http://*/*","https://*/*","file://*/*"]}], function(){ 326 | console.log("注册Content Script: Canvas interference") 327 | }) 328 | } else { 329 | // 关闭脚本注入 330 | chrome.scripting.getRegisteredContentScripts(function(injectContentScript){ 331 | if (injectContentScript != null && injectContentScript.length == 1 && injectContentScript[0].id != null && injectContentScript[0].id == "HInject"){ 332 | chrome.scripting.unregisterContentScripts({"ids":["HInject"]},function(){ 333 | console.log("卸载Content Script: Canvas interference") 334 | }) 335 | } 336 | }) 337 | } 338 | HConfig = changes.HConfig.newValue 339 | oldConfig = Object.assign({}, HConfig) 340 | } 341 | } 342 | } 343 | } 344 | 345 | // 状态 OnActive OnUpdated onReplaced onRemoved onHighlighted windows.onFocusChanged 346 | // 打开浏览器 1 2 1 2 347 | // 新建窗口 1 2 1 1 348 | // 新建标签页 1 2 1 349 | // 更换标签 1 1 350 | // 更换窗口 1 351 | // 新标签页打开某页面 4 352 | // 某页面新建某页面 1 4 1 353 | // 某页面跳转本域名某页面 4 354 | // 某页面跳转其他域名某页面 4 355 | // 刷新页面 3 356 | // 在当前页面关闭当前页面 1 1 1 357 | // 在当前页面关闭其他页面 1 1 358 | 359 | function initTabsMonitor(){ 360 | if (!chrome.tabs.onActivated.hasListener(tabsOnActiveChangedOrWindowsOnFocusChangedListener)){ 361 | chrome.tabs.onActivated.addListener(tabsOnActiveChangedOrWindowsOnFocusChangedListener) 362 | } else { 363 | console.log("tabsOnActiveChangedListener is Listening") 364 | } 365 | if (!chrome.windows.onFocusChanged.hasListener(tabsOnActiveChangedOrWindowsOnFocusChangedListener)){ 366 | chrome.windows.onFocusChanged.addListener(tabsOnActiveChangedOrWindowsOnFocusChangedListener) 367 | } else { 368 | console.log("windowsOnFocusChangedListener is Listening") 369 | } 370 | if (!chrome.tabs.onUpdated.hasListener(tabsOnUpdatedListener)){ 371 | chrome.tabs.onUpdated.addListener(tabsOnUpdatedListener) 372 | } else { 373 | console.log("tabsOnUpdatedListener is Listening") 374 | } 375 | if (!chrome.tabs.onRemoved.hasListener(tabsOnRemoveListener)){ 376 | chrome.tabs.onRemoved.addListener(tabsOnRemoveListener) 377 | } else { 378 | console.log("tabsOnRemoveListener is Listening") 379 | } 380 | } 381 | 382 | function tabsOnActiveChangedOrWindowsOnFocusChangedListener(tabId, selectInfo) { 383 | // 当前页面变量变更 384 | chrome.tabs.query({currentWindow: true, active: true}, function(tabArray) { 385 | if (tabArray[0] != null && tabArray[0].id != null && HConfig.currentTabs != tabArray[0].id){ 386 | HConfig.currentTabs = tabArray[0].id 387 | chrome.storage.local.set({HConfig: HConfig}, function() {}) 388 | } 389 | }) 390 | } 391 | 392 | function tabsOnUpdatedListener(tabId, changeInfo, tab) { 393 | // 清理缓存功能 394 | if (HConfig.noPageCache == true && HConfig.pluginStart == true){ 395 | chrome.browsingData.removeCache({"since": ((new Date()).getTime() - 3600000)},function(){}) 396 | } 397 | 398 | // 补充chrome页面跳转为新页面时执行更新响应体检测的tabsOnHighlightedResponseBodyCheckListener 399 | if (HConfig.responseCheck == true && HConfig.pluginStart == true){ 400 | if (changeInfo.status == "loading"){ 401 | if (changeInfo.url != null && changeInfo.url.search(/^chrome:\/\//i) == 0){ 402 | lastUpdate.chrome = true 403 | } else { 404 | if (lastUpdate.chrome == true){ 405 | tabsOnHighlightedResponseBodyCheckListener({"tabIds":[tabId]}) 406 | } 407 | lastUpdate.chrome = false 408 | } 409 | } 410 | } 411 | 412 | // 补充同标签页的url变更时icon和result不变的问题 413 | if (changeInfo.status == "loading"){ 414 | if (lastUpdate.tab == tabId){ 415 | // 同一标签页 416 | if (changeInfo.url != null){ 417 | if (changeInfo.url.split('/')[2] != lastUpdate.url){ 418 | // 出现同标签页url变更 419 | if (HSniffList["H"+tabId] != null && HSniffList["H"+HConfig.currentTabs].sresult.length != 0){ 420 | HSniffList["H"+tabId].sresult = [] 421 | HSniffList["H"+tabId].shost = changeInfo.url.split('/')[2] 422 | refreshResult() 423 | chrome.action.setBadgeText({text: ""}) 424 | } else { 425 | chrome.action.setBadgeText({text: ""}) 426 | } 427 | lastUpdate.url = changeInfo.url.split('/')[2] 428 | } 429 | } 430 | } else { 431 | // 跳转加载中的其他标签页 432 | lastUpdate.tab = tabId 433 | if (changeInfo.url != null){ 434 | lastUpdate.url = changeInfo.url.split('/')[2] 435 | } 436 | } 437 | } 438 | } 439 | 440 | function tabsOnRemoveListener(tabId, removeInfo){ 441 | // 删除关闭标签页的结果 442 | if (HSniffList["H"+tabId] != null){ 443 | delete HSniffList["H"+tabId] 444 | refreshResult() 445 | } 446 | } 447 | 448 | function checkRule(checkContent, checkRule){ 449 | if (checkContent.search(checkRule) == -1){ 450 | return false 451 | } else { 452 | return true 453 | } 454 | } 455 | 456 | function refreshResult(){ 457 | chrome.storage.local.set({HSniffList: HSniffList}, function() { 458 | console.log('Result is ') 459 | console.log(HSniffList) 460 | }) 461 | } 462 | 463 | function initCheckMonitor(){ 464 | if (!chrome.webRequest.onBeforeRequest.hasListener(webRequestOnbeforeRequestListener)){ 465 | chrome.webRequest.onBeforeRequest.addListener(webRequestOnbeforeRequestListener, {urls: ["http://*/*","https://*/*"]}, ["requestBody","extraHeaders"]) 466 | } else { 467 | console.log("webRequestOnbeforeRequestListener is Listening") 468 | } 469 | if (!chrome.webRequest.onBeforeSendHeaders.hasListener(webRequestOnBeforeSendHeadersListener)){ 470 | chrome.webRequest.onBeforeSendHeaders.addListener(webRequestOnBeforeSendHeadersListener, {urls: ["http://*/*","https://*/*"]}, ["requestHeaders","extraHeaders"]) 471 | } else { 472 | console.log("webRequestOnBeforeSendHeadersListener is Listening") 473 | } 474 | if (!chrome.webRequest.onResponseStarted.hasListener(webRequestOnResponseStartedListener)){ 475 | chrome.webRequest.onResponseStarted.addListener(webRequestOnResponseStartedListener, {urls: [""]}, ["responseHeaders","extraHeaders"]) 476 | } else { 477 | console.log("webRequestOnResponseStartedListener is Listening") 478 | } 479 | 480 | setResponseCheckListener() 481 | 482 | if (HConfig.blockHoneypot == true) { 483 | chrome.declarativeNetRequest.getDynamicRules(function(currentRules){ 484 | if (currentRules.length == 0) { 485 | chrome.declarativeNetRequest.updateDynamicRules( {"addRules" : HBlockingDomainRules, "removeRuleIds" : [] }, function(){console.log("动态添加Blocking规则")}) 486 | } else { 487 | console.log("添加失败,Blocking规则已存在") 488 | } 489 | }) 490 | } 491 | 492 | checkSelectFunction() 493 | } 494 | 495 | function deleteCheckMonitor(){ 496 | if (chrome.webRequest.onBeforeRequest.hasListener(webRequestOnbeforeRequestListener)){ 497 | chrome.webRequest.onBeforeRequest.removeListener(webRequestOnbeforeRequestListener) 498 | } else { 499 | console.log("webRequestOnbeforeRequestListener is not Listening") 500 | } 501 | if (chrome.webRequest.onBeforeSendHeaders.hasListener(webRequestOnBeforeSendHeadersListener)){ 502 | chrome.webRequest.onBeforeSendHeaders.removeListener(webRequestOnBeforeSendHeadersListener) 503 | } else { 504 | console.log("webRequestOnBeforeSendHeadersListener is not Listening") 505 | } 506 | if (chrome.webRequest.onResponseStarted.hasListener(webRequestOnResponseStartedListener)){ 507 | chrome.webRequest.onResponseStarted.removeListener(webRequestOnResponseStartedListener) 508 | } else { 509 | console.log("webRequestOnResponseStartedListener is not Listening") 510 | } 511 | chrome.storage.local.set({HSniffList: {}}, function() {}) 512 | 513 | setResponseCheckListener() 514 | 515 | if (HConfig.blockHoneypot == true) { 516 | chrome.declarativeNetRequest.getDynamicRules(function(currentRules){ 517 | if (currentRules.length != 0) { 518 | let removeNumberArray = Array.from(new Array(currentRules.length+1).keys()).slice(1) 519 | chrome.declarativeNetRequest.updateDynamicRules( {"addRules" : [], "removeRuleIds" : removeNumberArray }, function(){console.log("动态删除Blocking规则")}) 520 | } else { 521 | console.log("无需删除,Blocking规则不存在") 522 | } 523 | }) 524 | } 525 | 526 | checkSelectFunction() 527 | } 528 | 529 | function setResponseCheckListener(){ 530 | if (HConfig.responseCheck == null || HConfig.responseCheck == false) { 531 | // 设置为关闭时 532 | if (chrome.tabs.onHighlighted.hasListener(tabsOnHighlightedResponseBodyCheckListener)){ 533 | chrome.tabs.onHighlighted.removeListener(tabsOnHighlightedResponseBodyCheckListener) 534 | if (debuggerAttach.attachingTab != -999) { 535 | chrome.debugger.getTargets(function(tabsArray){ 536 | for (let i of tabsArray) { 537 | if (i.attached == true && i.tabId != null) { 538 | chrome.debugger.detach({tabId: i.tabId}) 539 | } 540 | } 541 | debuggerAttach.attachingTab = -999 542 | debuggerAttach.attachingContent = {} 543 | }) 544 | } 545 | } else { 546 | console.log("tabsOnHighlightedResponseBodyCheckListener is not Listening") 547 | } 548 | if (chrome.debugger.onEvent.hasListener(networkHandlerOnAttachTabsListener)) { 549 | chrome.debugger.onEvent.removeListener(networkHandlerOnAttachTabsListener) 550 | } else { 551 | console.log("networkHandlerOnAttachTabsListener is not Listening") 552 | } 553 | if (chrome.debugger.onDetach.hasListener(debuggerOnDetachListener)) { 554 | chrome.debugger.onDetach.removeListener(debuggerOnDetachListener) 555 | } else { 556 | console.log("debuggerOnDetachListener is not Listening") 557 | } 558 | } else { 559 | // 设置为启动时 560 | debuggerAttach.attachingTab = -999 561 | debuggerAttach.attachingContent = {} 562 | // 切换标签时处理逻辑 563 | chrome.tabs.onHighlighted.addListener(tabsOnHighlightedResponseBodyCheckListener) 564 | tabsOnHighlightedResponseBodyCheckListener({"tabIds":[HConfig.currentTabs]}) 565 | } 566 | } 567 | 568 | function addSniffList(i, details) { 569 | let newResult 570 | newResult = {sid: i.type, scontent: i.commandments} 571 | if (HSniffList["H"+details.tabId.toString()] == null){ 572 | // 新的tabs结果 573 | HSniffList["H"+details.tabId.toString()] = {shost: "", sresult: []} 574 | HSniffList["H"+details.tabId.toString()].sresult.push(newResult) 575 | if (details.type == "main_frame" && details.initiator == null){ 576 | HSniffList["H"+details.tabId.toString()].shost = details.url.split('/')[2] 577 | } else { 578 | HSniffList["H"+details.tabId.toString()].shost = details.initiator.split('/')[2] 579 | } 580 | refreshResult() 581 | } else { 582 | // 在已有tabs结果中修改 583 | if ((details.type == "main_frame" && details.url.split('/')[2] == HSniffList["H"+details.tabId.toString()].shost) || (details.initiator != null && HSniffList["H"+details.tabId.toString()].shost == details.initiator.split('/')[2]) ){ 584 | // host相同,直接添加 585 | if (!HSniffList["H"+details.tabId.toString()].sresult.some(item => { if (item.scontent == i.commandments) return true })){ 586 | HSniffList["H"+details.tabId.toString()].sresult.push(newResult) 587 | refreshResult() 588 | } 589 | } else { 590 | // host不同,判断是否是标签页变更host 591 | if (details.parentFrameId!=-1){ 592 | // 子框架,可能与主框架不同host,结果继承,子框架不干涉host更改 593 | if (!HSniffList["H"+details.tabId.toString()].sresult.some(item => { if (item.scontent == i.commandments) return true })){ 594 | HSniffList["H"+details.tabId.toString()].sresult.push(newResult) 595 | refreshResult() 596 | } 597 | } else { 598 | // 主框架,此时为该标签页host变更 599 | if (details.type == "main_frame" && details.initiator == null){ 600 | HSniffList["H"+details.tabId.toString()].shost = details.url.split('/')[2] 601 | } else { 602 | HSniffList["H"+details.tabId.toString()].shost = details.initiator.split('/')[2] 603 | } 604 | HSniffList["H"+details.tabId.toString()].sresult = [] 605 | HSniffList["H"+details.tabId.toString()].sresult.push(newResult) 606 | refreshResult() 607 | } 608 | } 609 | 610 | // 所有页面筛选超过告警10个jsonp的页面 611 | if (HSniffList["H"+details.tabId.toString()].sresult.length > 5 && HSniffList["H"+details.tabId.toString()].snotification == null) { 612 | let jsonpNumber = 0 613 | for ( let i of HSniffList["H"+details.tabId.toString()].sresult ) { 614 | if (i.sid == 4){ 615 | jsonpNumber++ 616 | } 617 | } 618 | if (jsonpNumber > 10){ 619 | HSniffList["H"+details.tabId.toString()].snotification = jsonpNumber 620 | chrome.tabs.get(details.tabId, function(honeypotTab){ 621 | if (honeypotTab != null) { 622 | chrome.notifications.create(details.tabId.toString(), {buttons: [{title: "确定"}], contextMessage: honeypotTab.title + "\n"+ honeypotTab.url, iconUrl: 'chrome-extension://'+ chrome.runtime.id+'/resource/img/icon/ico.png', message: "蜜罐jsonp类告警数量超过10个,该站点有较大可能为蜜罐", title: "Heimdallr", type: "basic"}) 623 | } 624 | }) 625 | refreshResult() 626 | } 627 | } 628 | } 629 | } 630 | 631 | 632 | 633 | // 对request url和request body进行识别 634 | function webRequestOnbeforeRequestListener(details) { 635 | if(details.type == 'main_frame' || details.type == 'sub_frame' || details.type == 'script' || details.type == 'xmlhttprequest' || details.type == 'image' || details.type == 'stylesheet' || details.type == 'other' || details.type == 'object'){ 636 | // url check 637 | // 其中类型为image的请求将只进行url识别(用于特定框架特征)而不进行body识别 638 | // console.log(11111,details) 639 | for ( let i of HPrinter.position1 ) { 640 | let checkResult = checkRule(details.url,i.rulecontent) 641 | if (checkResult == true){ 642 | addSniffList(i, details) 643 | } 644 | } 645 | // body request check 646 | // 获取body内容 647 | if (details.type != 'image' && details.type != 'stylesheet'){ 648 | let requestBodyContent = null 649 | if (details.requestBody != null){ 650 | if (details.requestBody.formData != null){ 651 | //formdata 652 | requestBodyContent = JSON.stringify(details.requestBody.formData).replace(/^{(.*)}$/,"$1") 653 | } else if (details.requestBody.raw != null){ 654 | if (details.requestBody.raw.length == 1 && details.requestBody.raw[0].bytes != null){ 655 | //json 656 | requestBodyContent = decodeURIComponent(encodeURIComponent(String.fromCharCode.apply(null, new Uint8Array(details.requestBody.raw[0].bytes)))) 657 | } else { 658 | //other 659 | for (let i of details.requestBody.raw) { 660 | if (i.bytes != null){ 661 | requestBodyContent = requestBodyContent + decodeURIComponent(encodeURIComponent(String.fromCharCode.apply(null, new Uint8Array(details.requestBody.raw[0].bytes)))) 662 | } else { 663 | requestBodyContent = requestBodyContent + JSON.stringify(i).replace(/^{(.*)}$/,"$1") 664 | } 665 | } 666 | } 667 | } else { 668 | return 669 | } 670 | // 与规则进行比较 671 | for ( let i of HPrinter.position3 ) { 672 | let checkResult = checkRule(requestBodyContent,i.rulecontent) 673 | if (checkResult == true){ 674 | addSniffList(i, details) 675 | } 676 | } 677 | } 678 | } 679 | } else if (details.type == 'websocket' || details.type == 'media' || details.type == 'font' || details.type == 'csp_report' || details.type == 'ping'){} 680 | //其他类型的请求,暂不处理 681 | } 682 | 683 | function webRequestOnBeforeSendHeadersListener(details) { 684 | if(details.type == 'main_frame' || details.type == 'sub_frame' || details.type == 'script' || details.type == 'xmlhttprequest' || details.type == 'other' || details.type == 'object'){ 685 | //console.log(22222,details) 686 | 687 | let nowlist = [] 688 | for ( let i of details.requestHeaders ) { 689 | nowlist.push(i.name) 690 | } 691 | for ( let i of HPrinter.position2 ) { 692 | if (nowlist.indexOf(i.rulecontent.name) != -1){ 693 | for (let j=0; jWhitelabel Error Page\<\/h1\>/im 84 | }, 85 | { 86 | rulename: "f9_oracle_weblogic_responsebody_1", 87 | type: 1, 88 | commandments:"Weblogic: 存在Weblogic 404页面", 89 | ruleposition: 5, 90 | rulecontent: /\Hypertext Transfer Protocol \-\- HTTP\/1\.1\<\/i\>/im 91 | }, 92 | { 93 | rulename: "f10_apache_shiro_requestheader_1", 94 | type: 1, 95 | commandments:"Shiro: 请求头包含rememberme特征", 96 | ruleposition: 2, 97 | rulecontent: {"name":"Cookie","value":/rememberme\=/im } 98 | }, 99 | { 100 | rulename: "f11_apache_shiro_requestheader_2", 101 | type: 1, 102 | commandments:"Shiro: 请求头包含deleteMe特征", 103 | ruleposition: 2, 104 | rulecontent: {"name":"Cookie","value":/\=deleteMe/im } 105 | }, 106 | { 107 | rulename: "f12_apache_shiro_responseheader_3", 108 | type: 1, 109 | commandments:"Shiro: 响应头包含rememberme特征", 110 | ruleposition: 4, 111 | rulecontent: {"name":"Set-Cookie","value":/rememberme\=/im } 112 | }, 113 | { 114 | rulename: "f13_apache_shiro_responseheader_4", 115 | type: 1, 116 | commandments:"Shiro: 响应头包含deleteMe特征", 117 | ruleposition: 4, 118 | rulecontent: {"name":"Set-Cookie","value":/\=deleteMe/im } 119 | }, 120 | { 121 | rulename: "f14_f5_bigip_requestheader_1", 122 | type: 1, 123 | commandments:"F5 BIG-IP: 请求头Cookie泄露应用的内网IP和端口", 124 | ruleposition: 2, 125 | rulecontent: {"name":"Cookie","value":/BIGipServer/im } 126 | }, 127 | { 128 | rulename: "f15_f5_bigip_requestheader_2", 129 | type: 1, 130 | commandments:"F5 BIG-IP: 响应头Set-Cookie泄露应用的内网IP和端口", 131 | ruleposition: 4, 132 | rulecontent: {"name":"Set-Cookie","value":/BIGipServer/im } 133 | }, 134 | { 135 | rulename: "f16_ecma_json_requestbody_1", 136 | type: 1, 137 | commandments:"Json: 请求体数据为json格式", 138 | ruleposition: 3, 139 | rulecontent: /^\{.*\}$/im 140 | }, 141 | { 142 | rulename: "f17_ecma_json_requestheader_2", 143 | type: 1, 144 | commandments:"Json: 请求头Content-Type为application/json", 145 | ruleposition: 2, 146 | rulecontent: {"name":"Content-Type","value":/application\/json/im } 147 | }, 148 | { 149 | rulename: "f18_ecma_json_responsebody_3", 150 | type: 1, 151 | commandments:"Json: 响应体数据为json格式", 152 | ruleposition: 5, 153 | rulecontent:/^\{.*\}$/im 154 | }, 155 | { 156 | rulename: "f19_infomation_ip_responsebody_1", 157 | type: 2, 158 | commandments:"敏感信息: 响应体存在IP地址", 159 | ruleposition: 5, 160 | rulecontent: /((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/im 161 | }, 162 | { 163 | rulename: "f20_infomation_phonenumber_responsebody_2", 164 | type: 2, 165 | commandments:"敏感信息: 响应体存在手机号码", 166 | ruleposition: 5, 167 | rulecontent: /1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}/im 168 | }, 169 | { 170 | rulename: "f21_infomation_email_responsebody_3", 171 | type: 2, 172 | commandments:"敏感信息: 响应体中存在邮箱地址", 173 | ruleposition: 5, 174 | rulecontent: /\w+@[\da-z\.-]+\.([a-z]{2,6}|[\u2E80-\u9FFF]{2,3})/im 175 | }, 176 | { 177 | rulename: "f22_infomation_identitynumber_responsebody_4", 178 | type: 2, 179 | commandments:"敏感信息: 响应体中存在身份证号", 180 | ruleposition: 5, 181 | rulecontent: /[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]/im 182 | }, 183 | { 184 | rulename: "f23_seeyon_oa_url_1", 185 | type: 1, 186 | commandments:"致远OA: Url包含特征静态资源目录", 187 | ruleposition: 1, 188 | rulecontent: /\/seeyon\/common\//im 189 | }, 190 | { 191 | rulename: "f24_seeyon_oa_url_2", 192 | type: 1, 193 | commandments:"致远OA: 加载特征图片资源", 194 | ruleposition: 1, 195 | rulecontent: /\/seeyon\/USER-DATA\/IMAGES\/LOGIN\/login\.gif/im 196 | }, 197 | { 198 | rulename: "f25_ufida_nc_url_1", 199 | type: 1, 200 | commandments:"用友NC: 加载特征图片资源ufida_nc.png", 201 | ruleposition: 1, 202 | rulecontent: /logo\/images\/ufida_nc\.png/im 203 | }, 204 | { 205 | rulename: "f26_ufida_nc_url_2", 206 | type: 1, 207 | commandments:"用友NC: 加载特征图片资源ufida.ico", 208 | ruleposition: 1, 209 | rulecontent: /logo\/images\/ufida\.ico/im 210 | }, 211 | { 212 | rulename: "f27_ufida_nc_url_3", 213 | type: 1, 214 | commandments:"用友NC: 加载特征图片资源icon_uclient.png", 215 | ruleposition: 1, 216 | rulecontent: /img\/icon_uclient\.png/im 217 | }, 218 | { 219 | rulename: "f28_ufida_nc_responsebody_4", 220 | type: 1, 221 | commandments:"用友软件: 响应体包含用友软件版权声明", 222 | ruleposition: 5, 223 | rulecontent: /UFIDA Software CO\.LTD all rights reserved/im 224 | }, 225 | { 226 | rulename: "f29_ufida_nc_responsebody_5", 227 | type: 1, 228 | commandments:"用友NC: 响应体包含用友UClient客户端链接", 229 | ruleposition: 5, 230 | rulecontent: /uclient\.yonyou\.com/im 231 | }, 232 | { 233 | rulename: "f30_ufida_tplus_url_1", 234 | type: 1, 235 | commandments:"用友畅捷通T+: 加载特征图片资源", 236 | ruleposition: 1, 237 | rulecontent: /\/tplus\/img\/portal\/tplus/im 238 | }, 239 | { 240 | rulename: "f31_ufida_tplus_url_2", 241 | type: 1, 242 | commandments:"用友畅捷通T+: 发起特征ajax请求", 243 | ruleposition: 1, 244 | rulecontent: /\/tplus\/ajaxpro\/Ufida/im 245 | }, 246 | { 247 | rulename: "f32_tongda_oa_url_1", 248 | type: 1, 249 | commandments:"通达OA: 加载特征图片资源", 250 | ruleposition: 1, 251 | rulecontent: /\/images\/tongda\.ico/im 252 | }, 253 | { 254 | rulename: "f33_tongda_oa_responsebody_2", 255 | type: 1, 256 | commandments:"通达OA: 响应体包含通达banner声明", 257 | ruleposition: 5, 258 | rulecontent: /北京通达信科科技有限公司/im 259 | }, 260 | { 261 | rulename: "f34_tongda_oa_responsebody_3", 262 | type: 1, 263 | commandments:"通达OA: 响应体包含通达信科官网链接", 264 | ruleposition: 5, 265 | rulecontent: /\/\/www\.tongda2000\.com/im 266 | }, 267 | { 268 | rulename: "f35_tongda_oa_responsebody_4", 269 | type: 2, 270 | commandments:"通达OA: 响应体检测到关键词[Office Anywhere]", 271 | ruleposition: 5, 272 | rulecontent: /Office Anywhere/im 273 | }, 274 | { 275 | rulename: "f36_tongda_oa_responsebody_5", 276 | type: 2, 277 | commandments:"通达OA: 响应体检测到关键词[通达OA移动版]", 278 | ruleposition: 5, 279 | rulecontent: /通达OA移动版/im 280 | }, 281 | { 282 | rulename: "f37_xintongda_oa_url_1", 283 | type: 1, 284 | commandments:"心通达OA: 加载特征图片资源", 285 | ruleposition: 1, 286 | rulecontent: /\/img\/replaceImg\/theme\d{1,2}\/LOGO\.png/im 287 | }, 288 | { 289 | rulename: "f38_xindian_oa_url_1", 290 | type: 1, 291 | commandments:"新点OA: 加载新点OA(V9.0)特征图片资源", 292 | ruleposition: 1, 293 | rulecontent: /\/login\/images\/ihpone\-dl\.png/im 294 | }, 295 | { 296 | rulename: "f39_finereport_report_url_1", 297 | type: 1, 298 | commandments:"帆软报表: 发起特征ajax请求", 299 | ruleposition: 1, 300 | rulecontent: /\/WebReport\/ReportServer\?op/im 301 | }, 302 | { 303 | rulename: "f40_landray_oa_url_1", 304 | type: 1, 305 | commandments:"蓝凌OA: 加载特征静态资源CSS文件", 306 | ruleposition: 1, 307 | rulecontent: /\/sys\/ui\/extend\/theme\/default\/style\/icon\.css/im 308 | }, 309 | { 310 | rulename: "f41_ioffice_oa_url_1", 311 | type: 2, 312 | commandments:"红帆OA: Url检测到关键词[ioffice]", 313 | ruleposition: 1, 314 | rulecontent: /\/ioffice\//im 315 | }, 316 | { 317 | rulename: "f42_ioffice_oa_url_2", 318 | type: 1, 319 | commandments:"红帆OA: Url包含特征请求路径", 320 | ruleposition: 1, 321 | rulecontent: /\/attachment\/file\/loginPreview\/\?objectId\=WebSite\_loginBackground\&/im 322 | }, 323 | { 324 | rulename: "f43_cnpower_oa_url_1", 325 | type: 1, 326 | commandments:"华天动力OA: 访问特征登录接口", 327 | ruleposition: 1, 328 | rulecontent: /\/OAapp\/WebObjects\/OAapp\.woa/im 329 | }, 330 | { 331 | rulename: "f44_ezoffice_oa_url_1", 332 | type: 1, 333 | commandments:"万户OA: 加载特征JS资源目录", 334 | ruleposition: 1, 335 | rulecontent: /\/defaultroot\/scripts\/main\/whir/im 336 | }, 337 | { 338 | rulename: "f45_ezoffice_oa_url_2", 339 | type: 1, 340 | commandments:"万户OA: 加载特征CSS资源目录", 341 | ruleposition: 1, 342 | rulecontent: /\/defaultroot\/templates\/template_system\/common\//im 343 | }, 344 | { 345 | rulename: "f46_kingdee_erp_url_1", 346 | type: 1, 347 | commandments:"金蝶云星空ERP: 加载特征CSS资源目录", 348 | ruleposition: 1, 349 | rulecontent: /\/HTML5\/content\/themes\/kdcss/im 350 | }, 351 | { 352 | rulename: "f47_ncoa_oa_responseheader_1", 353 | type: 2, 354 | commandments:"协众OA: 响应头包含Cookie特征[CNOAOASESSID]", 355 | ruleposition: 4, 356 | rulecontent: {"name":"Set-Cookie","value":/CNOAOASESSID/im } 357 | }, 358 | { 359 | rulename: "f48_jinher_oa_responseheader_1", 360 | type: 2, 361 | commandments:"金和OA: 响应头包含Cookie特征", 362 | ruleposition: 4, 363 | rulecontent: {"name":"Set-Cookie","value":/ASPSESSIONIDSSCDTDBS/im } 364 | }, 365 | { 366 | rulename: "f49_cnhcit_oa_url_1", 367 | type: 1, 368 | commandments:"海昌OA: 加载特征JS资源", 369 | ruleposition: 1, 370 | rulecontent: /\/loginmain4\/js\/jquery\min\.js/im 371 | }, 372 | { 373 | rulename: "f50_weaver_ecology_url_1", 374 | type: 1, 375 | commandments:"泛微OA E-Cology: 加载特征JS资源", 376 | ruleposition: 1, 377 | rulecontent: /\/wui\/theme\/ecology\d\//im 378 | }, 379 | { 380 | rulename: "f51_weaver_ecology_url_2", 381 | type: 1, 382 | commandments:"泛微OA E-Cology: 加载特征CSS资源", 383 | ruleposition: 1, 384 | rulecontent: /\/spa\/portal\/public\/index\.css/im 385 | }, 386 | { 387 | rulename: "f52_weaver_ecology_responseheader_3", 388 | type: 1, 389 | commandments:"泛微OA E-Cology: 响应头包含Cookie特征", 390 | ruleposition: 4, 391 | rulecontent: {"name":"Set-Cookie","value":/ecology\_JSessionId/im } 392 | }, 393 | { 394 | rulename: "f53_weaver_ecology_url_4", 395 | type: 2, 396 | commandments:"泛微OA E-Cology运维管理平台: 响应体包含banner关键字", 397 | ruleposition: 5, 398 | rulecontent: /e\-cology运维管理平台\<\/title\>/im 399 | }, 400 | { 401 | rulename: "f54_weaver_eoffice_url_1", 402 | type: 1, 403 | commandments:"泛微OA E-Office: 加载泛微E-office 9静态资源目录", 404 | ruleposition: 1, 405 | rulecontent: /\/newplugins\/js\/pnotify\/jquery\.pnotify/im 406 | }, 407 | { 408 | rulename: "f55_weaver_eoffice_url_2", 409 | type: 1, 410 | commandments:"泛微OA E-Office: 加载泛微E-office 10静态资源目录", 411 | ruleposition: 1, 412 | rulecontent: /\/eoffice10\/client\/web\/polyfills/im 413 | }, 414 | { 415 | rulename: "f56_weaver_ebridge_url_1", 416 | type: 1, 417 | commandments:"泛微云桥 E-Bridge: 加载特征图片资源", 418 | ruleposition: 1, 419 | rulecontent: /\/main\/login\/images\/loginlogo\.png$/im 420 | }, 421 | { 422 | rulename: "f57_weaver_emobile_responseheader_1", 423 | type: 1, 424 | commandments:"泛微OA E-mobile: 响应头包含Server特征", 425 | ruleposition: 4, 426 | rulecontent: {"name":"Server","value":/^EMobileServer$/im } 427 | }, 428 | { 429 | rulename: "f58_weaver_emobile_responsebody_1", 430 | type: 2, 431 | commandments:"泛微OA E-mobile移动管理平台: 响应体包含banner关键字", 432 | ruleposition: 5, 433 | rulecontent: /\移动管理平台((\-企业)|(消息服务 ))管理/im 434 | }, 435 | { 436 | rulename: "f59_trsid_ids_responseheader_1", 437 | type: 2, 438 | commandments:"拓尔思SSO: 响应头包含Cookie特征", 439 | ruleposition: 4, 440 | rulecontent: {"name":"Set-Cookie","value":/trsidsssosessionid/im } 441 | }, 442 | { 443 | rulename: "f60_trsid_wcm_responseheader_1", 444 | type: 2, 445 | commandments:"拓尔思内容管理系统: 响应头包含Cookie特征", 446 | ruleposition: 4, 447 | rulecontent: {"name":"Set-Cookie","value":/com\.trs\.idm\.coSessionId/im } 448 | }, 449 | { 450 | rulename: "f61_eyou_mail_url_1", 451 | type: 1, 452 | commandments:"亿邮Eyou邮件系统: 加载特征图片资源", 453 | ruleposition: 1, 454 | rulecontent: /\/tpl\/login\/user\/images\/login\_logo\.png/im 455 | }, 456 | { 457 | rulename: "f62_coremail_mail_url_1", 458 | type: 1, 459 | commandments:"论客coremail邮件系统: 加载特征静态资源目录", 460 | ruleposition: 1, 461 | rulecontent: /\/coremail\/common\/assets\//im 462 | }, 463 | { 464 | rulename: "f63_microsoft_mail_url_1", 465 | type: 1, 466 | commandments:"Microsoft Exchange邮件系统: 访问Exchange登录接口", 467 | ruleposition: 1, 468 | rulecontent: /\/owa\/auth\/logon\.aspx/im 469 | }, 470 | { 471 | rulename: "f64_ruoyi_cms_url_1", 472 | type: 1, 473 | commandments:"若依后台管理系统: 加载特征CSS资源", 474 | ruleposition: 1, 475 | rulecontent: /\/ruoyi\/css\/ry\-ui\.css/im 476 | }, 477 | { 478 | rulename: "f65_wordpress_cms_url_1", 479 | type: 1, 480 | commandments:"Wordprees: 加载特征静态资源目录", 481 | ruleposition: 1, 482 | rulecontent: /\/wp-content\/themes\//im 483 | }, 484 | { 485 | rulename: "f66_xylink_videoplatform_url_1", 486 | type: 1, 487 | commandments:"小鱼易连云视讯管理平台: 请求小鱼易连RSA公钥接口", 488 | ruleposition: 1, 489 | rulecontent: /\/console\/rsa\/publicKey\?securityKey\=$/im 490 | }, 491 | { 492 | rulename: "f67_apache_tomcat_responseheader_1", 493 | type: 1, 494 | commandments:"Tomcat: 响应头Server字段带有Tomcat特征", 495 | ruleposition: 4, 496 | rulecontent: {"name":"Server","value":/^Apache\-Coyote/im } 497 | }, 498 | { 499 | rulename: "f58_microsoft_iis_responseheader_1", 500 | type: 1, 501 | commandments:"IIS: 响应头Server字段带有IIS特征", 502 | ruleposition: 4, 503 | rulecontent: {"name":"Server","value":/^Microsoft\-IIS/im } 504 | }, 505 | { 506 | rulename: "f59_wildfly_jboss_responseheader_1", 507 | type: 1, 508 | commandments:"Jboss: 响应头X-Powered-By字段带有Jboss特征", 509 | ruleposition: 4, 510 | rulecontent: {"name":"X-Powered-By","value":/JBossWeb\-/im } 511 | }, 512 | { 513 | rulename: "f60_eclipse_jetty_responseheader_1", 514 | type: 1, 515 | commandments:"Jetty: 响应头Server字段带有Jetty特征", 516 | ruleposition: 4, 517 | rulecontent: {"name":"Server","value":/^Jetty/im } 518 | }, 519 | { 520 | rulename: "f61_ibm_websphere_responseheader_1", 521 | type: 1, 522 | commandments:"IBM WebSphere: 响应头检测到Server特征", 523 | ruleposition: 4, 524 | rulecontent: {"name":"Server","value":/^WebSphere /im } 525 | }, 526 | { 527 | rulename: "f62_oracle_weblogic_responseheader_1", 528 | type: 1, 529 | commandments:"Weblogic: 响应头Server字段带有Weblogic特征", 530 | ruleposition: 4, 531 | rulecontent: {"name":"Server","value":/^WebLogic/im } 532 | }, 533 | { 534 | rulename: "f63_oracle_weblogic_responseheader_2", 535 | type: 1, 536 | commandments:"Weblogic: 响应头检测到X-Powered-By特征", 537 | ruleposition: 4, 538 | rulecontent: {"name":"X-Powered-By","value":/^Servlet\/\d\.\d JSP\/\d\.\d$/im } 539 | }, 540 | { 541 | rulename: "f64_thinkphp_cms_responseheader_1", 542 | type: 1, 543 | commandments:"ThinkPHP: 响应头检测到X-Powered-By特征", 544 | ruleposition: 4, 545 | rulecontent: {"name":"X-Powered-By","value":/^ThinkPHP$/im } 546 | }, 547 | { 548 | rulename: "f65_thinkphp_cms_responsebody_2", 549 | type: 2, 550 | commandments:"ThinkPHP: 响应体包含ThinkPHP v3报错banner特征", 551 | ruleposition: 5, 552 | rulecontent: /\{ Fast \& Simple OOP PHP Framework \} \-\- \[ WE CAN DO IT JUST THINK \]/im 553 | }, 554 | { 555 | rulename: "f66_thinkphp_cms_responsebody_3", 556 | type: 2, 557 | commandments:"ThinkPHP: 响应体包含ThinkPHP v5报错banner特征", 558 | ruleposition: 5, 559 | rulecontent: /十年磨一剑 \- 为API开发设计的高性能框架/im 560 | }, 561 | { 562 | rulename: "f67_showdoc_doc_url_1", 563 | type: 1, 564 | commandments:"ShowDoc协同文档: 加载特征JS资源", 565 | ruleposition: 1, 566 | rulecontent: /\/static\/editor.md\/lib\/sequence\-diagram\.min\.js/im 567 | }, 568 | { 569 | rulename: "f68_laravel_cms_responsecookie_1", 570 | type: 1, 571 | commandments:"Laravel: 响应头包含Cookie特征", 572 | ruleposition: 4, 573 | rulecontent: {"name":"Set-Cookie","value":/laravel\_session/im } 574 | }, 575 | { 576 | rulename: "f69_kindeditor_kindeditor_url_1", 577 | type: 2, 578 | commandments:"KindEditor: Url检测到关键字[kindeditor]", 579 | ruleposition: 1, 580 | rulecontent: /kindeditor/im 581 | }, 582 | { 583 | rulename: "f70_kindeditor_kindeditor_url_2", 584 | type: 1, 585 | commandments:"KindEditor: 加载配置文件kindeditor-all-min.js", 586 | ruleposition: 1, 587 | rulecontent: /kindeditor\-all\-min\.js/im 588 | }, 589 | { 590 | rulename: "f71_kindeditor_kindeditor_url_3", 591 | type: 1, 592 | commandments:"KindEditor: 加载配置文件kindeditor-min.js", 593 | ruleposition: 1, 594 | rulecontent: /kindeditor\-min\.js/im 595 | }, 596 | { 597 | rulename: "f72_fckeditor_fckeditor_url_1", 598 | type: 2, 599 | commandments:"FCKeditor: Url检测到关键字[fckeditor]", 600 | ruleposition: 1, 601 | rulecontent: /fckeditor/im 602 | }, 603 | { 604 | rulename: "f73_fckeditor_fckeditor_url_2", 605 | type: 1, 606 | commandments:"FCKeditor: 加载特征CSS资源", 607 | ruleposition: 1, 608 | rulecontent: /\/fckeditor\.css\?/im 609 | }, 610 | { 611 | rulename: "f74_ewebeditor_ewebeditor_url_1", 612 | type: 2, 613 | commandments:"eWebeditor: Url检测到关键字[ewebeditor]", 614 | ruleposition: 1, 615 | rulecontent: /ewebeditor/im 616 | }, 617 | { 618 | rulename: "f75_ewebeditor_ewebeditor_url_2", 619 | type: 1, 620 | commandments:"eWebeditor: 加载配置文件ewebeditor.js", 621 | ruleposition: 1, 622 | rulecontent: /ewebeditor\.js/im 623 | }, 624 | { 625 | rulename: "f76_jeesite_cms_url_1", 626 | type: 1, 627 | commandments:"JeeSite快速开发平台: 加载特征JS资源", 628 | ruleposition: 1, 629 | rulecontent: /\/static\/tongji\/plugins\/UrlChangeTracker\.js/im 630 | }, 631 | { 632 | rulename: "f77_hikvision_ipcamera_url_1", 633 | type: 1, 634 | commandments:"Hikvision网络摄像头: 加载firmware 5.0静态资源", 635 | ruleposition: 1, 636 | rulecontent: /\/doc\/script\/config\/system\/channelDigital\.js\?version\=/im 637 | }, 638 | { 639 | rulename: "f78_hikvision_ipcamera_url_2", 640 | type: 1, 641 | commandments:"Hikvision网络摄像头: 加载firmware静态资源", 642 | ruleposition: 1, 643 | rulecontent: /\/doc\/script\/jquery\.cookie\.js/im 644 | }, 645 | { 646 | rulename: "f79_hikvision_isecurecenter_url_1", 647 | type: 1, 648 | commandments:"Hikvision安防管理平台: 发起特征授权检查请求", 649 | ruleposition: 1, 650 | rulecontent: /\/portal\/login\/ajax\/licenseExpire\.do/im 651 | }, 652 | { 653 | rulename: "f80_hikvision_isecurecenter_url_2", 654 | type: 1, 655 | commandments:"Hikvision安防管理平台: 加载特征国际化json文件", 656 | ruleposition: 1, 657 | rulecontent: /\/portal\/ui\/static\/i18n\/\w{5}\/index\.json/im 658 | }, 659 | { 660 | rulename: "f81_hikvision_isecurecenter_url_3", 661 | type: 1, 662 | commandments:"Hikvision安防管理平台: 加载特征CSS资源", 663 | ruleposition: 1, 664 | rulecontent: /\/portal\/ui\/static\/skin\/redblack\/skin\.css/im 665 | }, 666 | { 667 | rulename: "f82_hikvision_isecurecenter_url_4", 668 | type: 1, 669 | commandments:"Hikvision安防管理平台(国外版): 加载特征JSON文件", 670 | ruleposition: 1, 671 | rulecontent: /\/Common\/i18n\/en\/msg.json\?\d/im 672 | }, 673 | { 674 | rulename: "f83_hikvision_videomanager_url_1", 675 | type: 1, 676 | commandments:"Hikvision图像综合应用平台: 加载特征国际化配置文件", 677 | ruleposition: 1, 678 | rulecontent: /\/cas\/static\/comp\/i18n\/package\.properties\?\_\=\d/im 679 | }, 680 | { 681 | rulename: "f84_dedecms_cms_url_1", 682 | type: 1, 683 | commandments:"织梦DedeCMS: 加载特征静态资源目录", 684 | ruleposition: 1, 685 | rulecontent: /\/uploads\/allimg\//im 686 | }, 687 | { 688 | rulename: "f85_dedecms_cms_url_2", 689 | type: 2, 690 | commandments:"织梦DedeCMS: Url检测到关键字[dedecms]", 691 | ruleposition: 1, 692 | rulecontent: /dedecms/im 693 | }, 694 | { 695 | rulename: "f86_dedecms_cms_url_3", 696 | type: 1, 697 | commandments:"织梦DedeCMS: 加载特征JS资源", 698 | ruleposition: 1, 699 | rulecontent: /\/include\/dedeajax2\.js/im 700 | }, 701 | { 702 | rulename: "f87_dedecms_cms_url_4", 703 | type: 1, 704 | commandments:"织梦DedeCMS: 加载特征图片目录(高检出规则可能误报)", 705 | ruleposition: 1, 706 | rulecontent: /\/templets\/\w+?\/images\/\w+?\.(jpg|png|ico)$/im 707 | }, 708 | { 709 | rulename: "f88_atlassian_jira_url_1", 710 | type: 1, 711 | commandments:"Jira项目管理系统: 加载特征CSS资源", 712 | ruleposition: 1, 713 | rulecontent: /jira\.webresources/im 714 | }, 715 | { 716 | rulename: "f89_atlassian_confluence_url_1", 717 | type: 2, 718 | commandments:"Confluence企业Wiki: URL检测到关键字[confluence]", 719 | ruleposition: 1, 720 | rulecontent: /confluence/im 721 | }, 722 | { 723 | rulename: "f90_atlassian_confluence_url_2", 724 | type: 1, 725 | commandments:"Confluence企业Wiki: 加载特征静态资源目录", 726 | ruleposition: 1, 727 | rulecontent: /com\.atlassian\.confluence/im 728 | }, 729 | { 730 | rulename: "f91_java_web_responsecookie_1", 731 | type: 2, 732 | commandments:"Java Web: 响应头包含Cookie特征[jsessionid]", 733 | ruleposition: 4, 734 | rulecontent: {"name":"Set-Cookie","value":/JSESSIONID/im } 735 | }, 736 | { 737 | rulename: "f92_webber_boda_url_1", 738 | type: 1, 739 | commandments:"博达站群: 加载特征JS资源", 740 | ruleposition: 1, 741 | rulecontent: /\/\_sitegray\/\_sitegray\.js/im 742 | }, 743 | { 744 | rulename: "f93_alibaba_dubbo_responseheader_1", 745 | type: 2, 746 | commandments:"Dubbo RPC框架: 响应头包含WWW-Authenticate特征", 747 | ruleposition: 4, 748 | rulecontent: {"name":"WWW-Authenticate","value":/Basic realm\=\"dubbo\"/im } 749 | }, 750 | { 751 | rulename: "f94_oray_sunlogin_responsebody_1", 752 | type: 1, 753 | commandments:"向日葵客户端: 响应体为认证端口开启的回显特征", 754 | ruleposition: 5, 755 | rulecontent: /\{\"success\"\:false\,\"msg\"\:\"Verification failure\"\}/im 756 | }, 757 | { 758 | rulename: "f95_baota_waf_url_1", 759 | type: 1, 760 | commandments:"宝塔面板Waf: 响应体包含特征响应内容", 761 | ruleposition: 5, 762 | rulecontent: /\

您的请求带有不合法参数,已被网站管理员设置拦截!\<\/p\>/im 763 | }, 764 | { 765 | rulename: "f96_baota_login_url_1", 766 | type: 1, 767 | commandments:"宝塔面板: Url加载特征图片资源", 768 | ruleposition: 1, 769 | rulecontent: /app\.bt\.cn\/static\/app\.png/im 770 | }, 771 | { 772 | rulename: "f97_metinfo_cms_url_1", 773 | type: 1, 774 | commandments:"米拓metinfo CMS: 加载特征CSS文件", 775 | ruleposition: 1, 776 | rulecontent: /\/metinfo\.css/im 777 | }, 778 | { 779 | rulename: "f98_teleport_operationmanager_url_1", 780 | type: 1, 781 | commandments:"Teleport 堡垒机: 加载特征Logo资源", 782 | ruleposition: 1, 783 | rulecontent: /\/static\/img\/site\-logo\.png\?v\=/im 784 | }, 785 | { 786 | rulename: "f99_qzsec_operationmanager_url_1", 787 | type: 1, 788 | commandments:"齐治堡垒机: 加载特征Logo资源", 789 | ruleposition: 1, 790 | rulecontent: /\/resources\/themes\/images\/logo\-login\.png$/im 791 | }, 792 | { 793 | rulename: "f100_pldsec_operationmanager_url_1", 794 | type: 1, 795 | commandments:"帕拉迪堡垒机: 加载特征CSS资源", 796 | ruleposition: 1, 797 | rulecontent: /\/module\/image\/pldsec\.css$/im 798 | }, 799 | { 800 | rulename: "f101_h3c_operationmanager_url_1", 801 | type: 1, 802 | commandments:"H3C堡垒机: 发起特征配置获取请求", 803 | ruleposition: 1, 804 | rulecontent: /\/webui\/resources\/sysManager$/im 805 | }, 806 | { 807 | rulename: "f102_nsfocus_firewall_responseheader_1", 808 | type: 1, 809 | commandments:"绿盟防火墙: 响应头Server字段包含NsFocus特征", 810 | ruleposition: 4, 811 | rulecontent: {"name":"Server","value":/nsfocus/im } 812 | }, 813 | { 814 | rulename: "f103_safedog_waf_responseheader_1", 815 | type: 1, 816 | commandments:"安全狗WAF: 响应头Server字段包含SafeDog特征", 817 | ruleposition: 4, 818 | rulecontent: {"name":"Server","value":/^safedog/im } 819 | }, 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | // ========================================================================= 843 | // 蜜罐类特征 844 | // 数量 151 845 | // 可检测特征 846 | // 敏感域名请求(jsonp)、蜜罐资源特征、网站流量分析与跟踪请求、敏感关键词、敏感脚本调用 847 | // ========================================================================= 848 | 849 | { 850 | rulename: "h1_cnrstar_domain_url_1", 851 | type: 4, 852 | commandments:"敏感域名请求: ITPUB技术论坛", 853 | ruleposition: 1, 854 | rulecontent: /itpub.net/im 855 | }, 856 | { 857 | rulename: "h2_cnrstar_domain_url_2", 858 | type: 4, 859 | commandments:"敏感域名请求: 携程旅行", 860 | ruleposition: 1, 861 | rulecontent: /ctrip.com/im 862 | }, 863 | { 864 | rulename: "h3_cnrstar_domain_url_3", 865 | type: 4, 866 | commandments:"敏感域名请求: 携程旅行接口", 867 | ruleposition: 1, 868 | rulecontent: /c-ctrip.com/im 869 | }, 870 | { 871 | rulename: "h4_cnrstar_domain_url_4", 872 | type: 4, 873 | commandments:"敏感域名请求: 千图网", 874 | ruleposition: 1, 875 | rulecontent: /58pic.com/im 876 | }, 877 | { 878 | rulename: "h5_cnrstar_domain_url_5", 879 | type: 4, 880 | commandments:"敏感域名请求: CSDN", 881 | ruleposition: 1, 882 | rulecontent: /csdn.net/im 883 | }, 884 | { 885 | rulename: "h6_cnrstar_domain_url_6", 886 | type: 4, 887 | commandments:"敏感域名请求: IP.sb接口", 888 | ruleposition: 1, 889 | rulecontent: /api.ip.sb/im 890 | }, 891 | { 892 | rulename: "h7_cnrstar_domain_url_7", 893 | type: 4, 894 | commandments:"敏感域名请求: 聚力PPTV网络电视", 895 | ruleposition: 1, 896 | rulecontent: /pptv.com/im 897 | }, 898 | { 899 | rulename: "h8_cnrstar_domain_url_8", 900 | type: 4, 901 | commandments:"敏感域名请求: 直播吧", 902 | ruleposition: 1, 903 | rulecontent: /zhibo8.cc/im 904 | }, 905 | { 906 | rulename: "h9_cnrstar_domain_url_9", 907 | type: 4, 908 | commandments:"敏感域名请求: bit.ly短链接服务", 909 | ruleposition: 1, 910 | rulecontent: /bit.ly/im 911 | }, 912 | { 913 | rulename: "h10_cnrstar_domain_url_10", 914 | type: 4, 915 | commandments:"敏感域名请求: 腾讯NOW直播平台", 916 | ruleposition: 1, 917 | rulecontent: /now.qq.com/im 918 | }, 919 | { 920 | rulename: "h11_cnrstar_domain_url_11", 921 | type: 4, 922 | commandments:"敏感域名请求: 腾讯QQ接口1-c.v.qq.com", 923 | ruleposition: 1, 924 | rulecontent: /c.v.qq.com/im 925 | }, 926 | { 927 | rulename: "h12_cnrstar_domain_url_12", 928 | type: 4, 929 | commandments:"敏感域名请求: 腾讯QQ接口2-node.video.qq.com", 930 | ruleposition: 1, 931 | rulecontent: /node.video.qq.com/im 932 | }, 933 | { 934 | rulename: "h13_cnrstar_domain_url_13", 935 | type: 4, 936 | commandments:"敏感域名请求: ChinaUnix IT技术博客", 937 | ruleposition: 1, 938 | rulecontent: /chinaunix.net/im 939 | }, 940 | { 941 | rulename: "h14_cnrstar_domain_url_14", 942 | type: 4, 943 | commandments:"敏感域名请求: 优酷接口1-cmstool.youku.com", 944 | ruleposition: 1, 945 | rulecontent: /cmstool.youku.com/im 946 | }, 947 | { 948 | rulename: "h15_cnrstar_domain_url_15", 949 | type: 4, 950 | commandments:"敏感域名请求: 优酷接口2-hudong.vip.youku.com", 951 | ruleposition: 1, 952 | rulecontent: /hudong.vip.youku.com/im 953 | }, 954 | { 955 | rulename: "h16_cnrstar_domain_url_16", 956 | type: 4, 957 | commandments:"敏感域名请求: 网易跟帖", 958 | ruleposition: 1, 959 | rulecontent: /tie.163.com/im 960 | }, 961 | { 962 | rulename: "h17_cnrstar_domain_url_17", 963 | type: 4, 964 | commandments:"敏感域名请求: 网易163接口1-comment.api.163.com", 965 | ruleposition: 1, 966 | rulecontent: /comment.api.163.com/im 967 | }, 968 | { 969 | rulename: "h18_cnrstar_domain_url_18", 970 | type: 4, 971 | commandments:"敏感域名请求: 网易163接口2-comment.money.163.com", 972 | ruleposition: 1, 973 | rulecontent: /comment.money.163.com/im 974 | }, 975 | { 976 | rulename: "h19_cnrstar_domain_url_19", 977 | type: 4, 978 | commandments:"敏感域名请求: 当当网", 979 | ruleposition: 1, 980 | rulecontent: /dangdang.com/im 981 | }, 982 | { 983 | rulename: "h20_cnrstar_domain_url_20", 984 | type: 4, 985 | commandments:"敏感域名请求: UC浏览器", 986 | ruleposition: 1, 987 | rulecontent: /down2.uc.cn/im 988 | }, 989 | { 990 | rulename: "h21_cnrstar_domain_url_21", 991 | type: 4, 992 | commandments:"敏感域名请求: Github", 993 | ruleposition: 1, 994 | rulecontent: /github.com/im 995 | }, 996 | { 997 | rulename: "h22_cnrstar_domain_url_22", 998 | type: 4, 999 | commandments:"敏感域名请求: Github接口1-mozilla.github.io", 1000 | ruleposition: 1, 1001 | rulecontent: /mozilla.github.io/im 1002 | }, 1003 | { 1004 | rulename: "h23_cnrstar_domain_url_23", 1005 | type: 4, 1006 | commandments:"敏感域名请求: 虎牙直播", 1007 | ruleposition: 1, 1008 | rulecontent: /huya.com/im 1009 | }, 1010 | { 1011 | rulename: "h24_cnrstar_domain_url_24", 1012 | type: 4, 1013 | commandments:"敏感域名请求: 51CTO接口1-home.51cto.com", 1014 | ruleposition: 1, 1015 | rulecontent: /home.51cto.com/im 1016 | }, 1017 | { 1018 | rulename: "h25_cnrstar_domain_url_25", 1019 | type: 4, 1020 | commandments:"敏感域名请求: 51CTO接口2-ucenter.51cto.com", 1021 | ruleposition: 1, 1022 | rulecontent: /ucenter.51cto.com/im 1023 | }, 1024 | { 1025 | rulename: "h26_cnrstar_domain_url_26", 1026 | type: 4, 1027 | commandments:"敏感域名请求: 城通网盘", 1028 | ruleposition: 1, 1029 | rulecontent: /ctfile.com/im 1030 | }, 1031 | { 1032 | rulename: "h27_cnrstar_domain_url_27", 1033 | type: 4, 1034 | commandments:"敏感域名请求: 金融界财经金融门户", 1035 | ruleposition: 1, 1036 | rulecontent: /jrj.com.cn/im 1037 | }, 1038 | { 1039 | rulename: "h28_cnrstar_domain_url_28", 1040 | type: 4, 1041 | commandments:"敏感域名请求: 新浪爱问知识人问答平台", 1042 | ruleposition: 1, 1043 | rulecontent: /iask.sina.com.cn/im 1044 | }, 1045 | { 1046 | rulename: "h29_cnrstar_domain_url_29", 1047 | type: 4, 1048 | commandments:"敏感域名请求: 新浪接口1-ka.sina.com.cn", 1049 | ruleposition: 1, 1050 | rulecontent: /ka.sina.com.cn/im 1051 | }, 1052 | { 1053 | rulename: "h30_cnrstar_domain_url_30", 1054 | type: 4, 1055 | commandments:"敏感域名请求: 新浪接口2-新浪用户接口", 1056 | ruleposition: 1, 1057 | rulecontent: /login.sina.com.cn/im 1058 | }, 1059 | { 1060 | rulename: "h31_cnrstar_domain_url_31", 1061 | type: 4, 1062 | commandments:"敏感域名请求: 苹果itunes接口", 1063 | ruleposition: 1, 1064 | rulecontent: /itunes.apple.com/im 1065 | }, 1066 | { 1067 | rulename: "h32_cnrstar_domain_url_32", 1068 | type: 4, 1069 | commandments:"敏感域名请求: 新浪微博接口1-m.game.weibo.cn", 1070 | ruleposition: 1, 1071 | rulecontent: /m.game.weibo.cn/im 1072 | }, 1073 | { 1074 | rulename: "h33_cnrstar_domain_url_33", 1075 | type: 4, 1076 | commandments:"敏感域名请求: 新浪微博接口2-i.qr.weibo.cn", 1077 | ruleposition: 1, 1078 | rulecontent: /i.qr.weibo.cn/im 1079 | }, 1080 | { 1081 | rulename: "h34_cnrstar_domain_url_34", 1082 | type: 4, 1083 | commandments:"敏感域名请求: 新浪微博", 1084 | ruleposition: 1, 1085 | rulecontent: /weibo.com/im 1086 | }, 1087 | { 1088 | rulename: "h35_cnrstar_domain_url_35", 1089 | type: 4, 1090 | commandments:"敏感域名请求: ZOL中关村在线", 1091 | ruleposition: 1, 1092 | rulecontent: /my.zol.com.cn/im 1093 | }, 1094 | { 1095 | rulename: "h36_cnrstar_domain_url_36", 1096 | type: 4, 1097 | commandments:"敏感域名请求: 人人网", 1098 | ruleposition: 1, 1099 | rulecontent: /renren.com/im 1100 | }, 1101 | { 1102 | rulename: "h37_cnrstar_domain_url_37", 1103 | type: 4, 1104 | commandments:"敏感域名请求: 爱奇艺", 1105 | ruleposition: 1, 1106 | rulecontent: /iqiyi.com/im 1107 | }, 1108 | { 1109 | rulename: "h38_cnrstar_domain_url_38", 1110 | type: 4, 1111 | commandments:"敏感域名请求: 爱奇艺接口1-stc.iqiyipic.com", 1112 | ruleposition: 1, 1113 | rulecontent: /stc.iqiyipic.com/im 1114 | }, 1115 | { 1116 | rulename: "h39_cnrstar_domain_url_39", 1117 | type: 4, 1118 | commandments:"敏感域名请求: 芒果TV", 1119 | ruleposition: 1, 1120 | rulecontent: /playbill.api.mgtv.com/im 1121 | }, 1122 | { 1123 | rulename: "h40_cnrstar_domain_url_40", 1124 | type: 4, 1125 | commandments:"敏感域名请求: skylink即时通讯和视频聊天", 1126 | ruleposition: 1, 1127 | rulecontent: /skylink.io/im 1128 | }, 1129 | { 1130 | rulename: "h41_cnrstar_domain_url_41", 1131 | type: 4, 1132 | commandments:"敏感域名请求: 飞卢小说接口1-s.faloo.com", 1133 | ruleposition: 1, 1134 | rulecontent: /s.faloo.com/im 1135 | }, 1136 | { 1137 | rulename: "h42_cnrstar_domain_url_42", 1138 | type: 4, 1139 | commandments:"敏感域名请求: 飞卢小说接口2-u.faloo.com", 1140 | ruleposition: 1, 1141 | rulecontent: /u.faloo.com/im 1142 | }, 1143 | { 1144 | rulename: "h43_cnrstar_domain_url_43", 1145 | type: 4, 1146 | commandments:"敏感域名请求: 搜狐网", 1147 | ruleposition: 1, 1148 | rulecontent: /v2.sohu.com/im 1149 | }, 1150 | { 1151 | rulename: "h44_cnrstar_domain_url_44", 1152 | type: 4, 1153 | commandments:"敏感域名请求: 搜狐号", 1154 | ruleposition: 1, 1155 | rulecontent: /uis.i.sohu.com/im 1156 | }, 1157 | { 1158 | rulename: "h45_cnrstar_domain_url_45", 1159 | type: 4, 1160 | commandments:"敏感域名请求: 搜狗搜索", 1161 | ruleposition: 1, 1162 | rulecontent: /wap.sogou.com/im 1163 | }, 1164 | { 1165 | rulename: "h46_cnrstar_domain_url_46", 1166 | type: 4, 1167 | commandments:"敏感域名请求: ITeye软件开发交流社区", 1168 | ruleposition: 1, 1169 | rulecontent: /www.iteye.com/im 1170 | }, 1171 | { 1172 | rulename: "h47_cnrstar_domain_url_47", 1173 | type: 4, 1174 | commandments:"敏感域名请求: 猪八戒网外包平台", 1175 | ruleposition: 1, 1176 | rulecontent: /www.zbj.com/im 1177 | }, 1178 | { 1179 | rulename: "h48_cnrstar_domain_url_48", 1180 | type: 4, 1181 | commandments:"敏感域名请求: 美橙互联:域名注册、VPS、企业网站服务", 1182 | ruleposition: 1, 1183 | rulecontent: /cndns.com/im 1184 | }, 1185 | { 1186 | rulename: "h49_cnrstar_domain_url_49", 1187 | type: 4, 1188 | commandments:"敏感域名请求: 美橙互联:建站之星", 1189 | ruleposition: 1, 1190 | rulecontent: /sitestar.cn/im 1191 | }, 1192 | { 1193 | rulename: "h50_cnrstar_domain_url_50", 1194 | type: 4, 1195 | commandments:"敏感域名请求: FastAdmin后台开发框架官网接口", 1196 | ruleposition: 1, 1197 | rulecontent: /api.fastadmin.net/im 1198 | }, 1199 | { 1200 | rulename: "h51_cnrstar_domain_url_51", 1201 | type: 4, 1202 | commandments:"敏感域名请求: 百度接口1-m.site.baidu.com", 1203 | ruleposition: 1, 1204 | rulecontent: /m.site.baidu.com/im 1205 | }, 1206 | { 1207 | rulename: "h52_cnrstar_domain_url_52", 1208 | type: 4, 1209 | commandments:"敏感域名请求: 百度接口2-账号接口", 1210 | ruleposition: 1, 1211 | rulecontent: /passport.baidu.com/im 1212 | }, 1213 | { 1214 | rulename: "h53_cnrstar_domain_url_53", 1215 | type: 4, 1216 | commandments:"敏感域名请求: 百度接口3-wappassalltest.baidu.com", 1217 | ruleposition: 1, 1218 | rulecontent: /wappassalltest.baidu.com/im 1219 | }, 1220 | { 1221 | rulename: "h54_cnrstar_domain_url_54", 1222 | type: 4, 1223 | commandments:"敏感域名请求: 百度百科", 1224 | ruleposition: 1, 1225 | rulecontent: /baike.baidu.com/im 1226 | }, 1227 | { 1228 | rulename: "h55_cnrstar_domain_url_55", 1229 | type: 4, 1230 | commandments:"敏感域名请求: 百度商桥企业营销及在线客服接口", 1231 | ruleposition: 1, 1232 | rulecontent: /p.qiao.baidu.com/im 1233 | }, 1234 | { 1235 | rulename: "h56_cnrstar_domain_url_56", 1236 | type: 4, 1237 | commandments:"敏感域名请求: 百度地图", 1238 | ruleposition: 1, 1239 | rulecontent: /map.baidu.com/im 1240 | }, 1241 | { 1242 | rulename: "h57_cnrstar_domain_url_57", 1243 | type: 4, 1244 | commandments:"敏感域名请求: 百度接口4-datax.baidu.com", 1245 | ruleposition: 1, 1246 | rulecontent: /datax.baidu.com/im 1247 | }, 1248 | { 1249 | rulename: "h58_cnrstar_domain_url_58", 1250 | type: 4, 1251 | commandments:"敏感域名请求: 百度贴吧", 1252 | ruleposition: 1, 1253 | rulecontent: /tieba.baidu.com/im 1254 | }, 1255 | { 1256 | rulename: "h59_cnrstar_domain_url_59", 1257 | type: 4, 1258 | commandments:"敏感域名请求: 百度支付:度小满钱包", 1259 | ruleposition: 1, 1260 | rulecontent: /zhifu.baidu.com/im 1261 | }, 1262 | { 1263 | rulename: "h60_cnrstar_domain_url_60", 1264 | type: 4, 1265 | commandments:"敏感域名请求: 高德地图RESTful接口", 1266 | ruleposition: 1, 1267 | rulecontent: /restapi.amap.com/im 1268 | }, 1269 | { 1270 | rulename: "h61_cnrstar_domain_url_61", 1271 | type: 4, 1272 | commandments:"敏感域名请求: 千千静听", 1273 | ruleposition: 1, 1274 | rulecontent: /musicapi.taihe.com/im 1275 | }, 1276 | { 1277 | rulename: "h62_cnrstar_domain_url_62", 1278 | type: 4, 1279 | commandments:"敏感域名请求: 京东商城", 1280 | ruleposition: 1, 1281 | rulecontent: /api.m.jd.com/im 1282 | }, 1283 | { 1284 | rulename: "h63_cnrstar_domain_url_63", 1285 | type: 4, 1286 | commandments:"敏感域名请求: 凤凰网接口1-so.v.ifeng.com", 1287 | ruleposition: 1, 1288 | rulecontent: /so.v.ifeng.com/im 1289 | }, 1290 | { 1291 | rulename: "h64_cnrstar_domain_url_64", 1292 | type: 4, 1293 | commandments:"敏感域名请求: 凤凰网接口2-stadig.ifeng.com", 1294 | ruleposition: 1, 1295 | rulecontent: /stadig.ifeng.com/im 1296 | }, 1297 | { 1298 | rulename: "h65_cnrstar_domain_url_65", 1299 | type: 4, 1300 | commandments:"敏感域名请求: 博客园接口1-wz.cnblogs.com", 1301 | ruleposition: 1, 1302 | rulecontent: /wz.cnblogs.com/im 1303 | }, 1304 | { 1305 | rulename: "h66_cnrstar_domain_url_66", 1306 | type: 4, 1307 | commandments:"敏感域名请求: 博客园接口2-passport.cnblogs.com", 1308 | ruleposition: 1, 1309 | rulecontent: /passport.cnblogs.com/im 1310 | }, 1311 | { 1312 | rulename: "h67_cnrstar_domain_url_67", 1313 | type: 4, 1314 | commandments:"敏感域名请求: 博客园接口3-account.cnblogs.com", 1315 | ruleposition: 1, 1316 | rulecontent: /account.cnblogs.com/im 1317 | }, 1318 | { 1319 | rulename: "h68_cnrstar_domain_url_68", 1320 | type: 4, 1321 | commandments:"敏感域名请求: 疑似开发人员博客-mths.be", 1322 | ruleposition: 1, 1323 | rulecontent: /mths.be/im 1324 | }, 1325 | { 1326 | rulename: "h69_cnrstar_domain_url_69", 1327 | type: 5, 1328 | commandments:"敏感域名请求: 疑似表单验证和密码加密框架", 1329 | ruleposition: 1, 1330 | rulecontent: /validity.thatscaptaintoyou.com/im 1331 | }, 1332 | { 1333 | rulename: "h70_cnrstar_domain_url_70", 1334 | type: 4, 1335 | commandments:"敏感域名请求: ScorecardResearch互联网行为分析", 1336 | ruleposition: 1, 1337 | rulecontent: /sb.scorecardresearch.com/im 1338 | }, 1339 | { 1340 | rulename: "h71_cnrstar_domain_url_71", 1341 | type: 4, 1342 | commandments:"敏感域名请求: Growing企业级数据接口(多个社交网站使用)", 1343 | ruleposition: 1, 1344 | rulecontent: /assets.growingio.com/im 1345 | }, 1346 | { 1347 | rulename: "h72_cnrstar_domain_url_72", 1348 | type: 4, 1349 | commandments:"敏感域名请求: GNU操作系统", 1350 | ruleposition: 1, 1351 | rulecontent: /gnu.org/im 1352 | }, 1353 | { 1354 | rulename: "h73_cnrstar_domain_url_73", 1355 | type: 4, 1356 | commandments:"敏感域名请求: 阿里短链接平台接口", 1357 | ruleposition: 1, 1358 | rulecontent: /g.alicdn.com/im 1359 | }, 1360 | { 1361 | rulename: "h74_cnrstar_domain_url_74", 1362 | type: 4, 1363 | commandments:"敏感域名请求: 爱奇艺接口2-msg.qy.net", 1364 | ruleposition: 1, 1365 | rulecontent: /msg.qy.net/im 1366 | }, 1367 | { 1368 | rulename: "h75_cnrstar_domain_url_75", 1369 | type: 4, 1370 | commandments:"敏感域名请求: 电动志趣享", 1371 | ruleposition: 1, 1372 | rulecontent: /github.comgithub.com/im 1373 | }, 1374 | { 1375 | rulename: "h76_cnrstar_domain_url_76", 1376 | type: 4, 1377 | commandments:"敏感域名请求: 天涯论坛", 1378 | ruleposition: 1, 1379 | rulecontent: /tianya.cn/im 1380 | }, 1381 | { 1382 | rulename: "h77_cnrstar_domain_url_77", 1383 | type: 4, 1384 | commandments:"敏感域名请求: 猫扑网", 1385 | ruleposition: 1, 1386 | rulecontent: /passport.mop.com/im 1387 | }, 1388 | { 1389 | rulename: "h78_cnrstar_domain_url_78", 1390 | type: 4, 1391 | commandments:"敏感域名请求: 1616上网导航", 1392 | ruleposition: 1, 1393 | rulecontent: /chaxun.1616.net/im 1394 | }, 1395 | { 1396 | rulename: "h79_cnrstar_domain_url_79", 1397 | type: 4, 1398 | commandments:"敏感域名请求: 虎扑论坛", 1399 | ruleposition: 1, 1400 | rulecontent: /remind.hupu.com/im 1401 | }, 1402 | { 1403 | rulename: "h80_cnrstar_domain_url_80", 1404 | type: 4, 1405 | commandments:"敏感域名请求: 哔哩哔哩动画", 1406 | ruleposition: 1, 1407 | rulecontent: /bilibili.com/im 1408 | }, 1409 | { 1410 | rulename: "h81_cnrstar_domain_url_81", 1411 | type: 4, 1412 | commandments:"敏感域名请求: 阿里接口极有家装修平台", 1413 | ruleposition: 1, 1414 | rulecontent: /jiyoujia.com/im 1415 | }, 1416 | { 1417 | rulename: "h82_monyer_domain_url_1", 1418 | type: 4, 1419 | commandments:"敏感域名请求: 360天御企业安全平台", 1420 | ruleposition: 1, 1421 | rulecontent: /appscan.360.cn/im 1422 | }, 1423 | { 1424 | rulename: "h83_monyer_domain_url_2", 1425 | type: 4, 1426 | commandments:"敏感域名请求: 小米手机服务", 1427 | ruleposition: 1, 1428 | rulecontent: /m.mi.com/im 1429 | }, 1430 | { 1431 | rulename: "h84_monyer_domain_url_3", 1432 | type: 4, 1433 | commandments:"敏感域名请求: 百度支付:度小满钱包2", 1434 | ruleposition: 1, 1435 | rulecontent: /zhifu.duxiaoman.com/im 1436 | }, 1437 | { 1438 | rulename: "h85_monyer_domain_url_4", 1439 | type: 4, 1440 | commandments:"敏感域名请求: 小米账户", 1441 | ruleposition: 1, 1442 | rulecontent: /account.xiaomi.com/im 1443 | }, 1444 | { 1445 | rulename: "h86_monyer_domain_url_5", 1446 | type: 4, 1447 | commandments:"敏感域名请求: 阿里淘宝网接口1-log.mmstat.com", 1448 | ruleposition: 1, 1449 | rulecontent: /log.mmstat.com/im 1450 | }, 1451 | { 1452 | rulename: "h87_monyer_domain_url_6", 1453 | type: 4, 1454 | commandments:"敏感域名请求: 小米接口1-s1.mi.com", 1455 | ruleposition: 1, 1456 | rulecontent: /s1.mi.com/im 1457 | }, 1458 | { 1459 | rulename: "h88_monyer_domain_url_7", 1460 | type: 4, 1461 | commandments:"敏感域名请求: 阿里淘宝网接口2-fourier.taobao.com", 1462 | ruleposition: 1, 1463 | rulecontent: /fourier.taobao.com/im 1464 | }, 1465 | { 1466 | rulename: "h89_monyer_domain_url_8", 1467 | type: 4, 1468 | commandments:"敏感域名请求: Fingerprints设备识别", 1469 | ruleposition: 1, 1470 | rulecontent: /api.fpjs.io/im 1471 | }, 1472 | { 1473 | rulename: "h90_monyer_domain_url_9", 1474 | type: 4, 1475 | commandments:"敏感域名请求: Fingerprints设备识别2", 1476 | ruleposition: 1, 1477 | rulecontent: /api.sjpf.io/im 1478 | }, 1479 | { 1480 | rulename: "h91_monyer_websitestatistical_10", 1481 | type: 5, 1482 | commandments:"网站流量分析与跟踪请求: 百度统计", 1483 | ruleposition: 1, 1484 | rulecontent: /hm\.baidu\.com/im 1485 | }, 1486 | { 1487 | rulename: "h92_monyer_websitestatistical_11", 1488 | type: 5, 1489 | commandments:"网站流量分析与跟踪请求: 友盟CNZZ网站流量统计", 1490 | ruleposition: 1, 1491 | rulecontent: /cnzz\.com/im 1492 | }, 1493 | { 1494 | rulename: "h93_monyer_websitestatistical_12", 1495 | type: 5, 1496 | commandments:"网站流量分析与跟踪请求: 51LA网站统计与数据分析", 1497 | ruleposition: 1, 1498 | rulecontent: /51\.la/im 1499 | }, 1500 | { 1501 | rulename: "h94_monyer_websitestatistical_13", 1502 | type: 5, 1503 | commandments:"网站流量分析与跟踪请求: 谷歌分析统计", 1504 | ruleposition: 1, 1505 | rulecontent: /google\-analytics\.com/im 1506 | }, 1507 | { 1508 | rulename: "h95_monyer_websitestatistical_14", 1509 | type: 5, 1510 | commandments:"网站流量分析与跟踪请求: 谷歌访问跟踪器", 1511 | ruleposition: 1, 1512 | rulecontent: /googletagservices\.com/im 1513 | }, 1514 | { 1515 | rulename: "h96_fuckjsonp_domain_url_1", 1516 | type: 4, 1517 | commandments:"敏感域名请求: 腾讯视频接口", 1518 | ruleposition: 1, 1519 | rulecontent: /access.video.qq.com/im 1520 | }, 1521 | { 1522 | rulename: "h97_fuckjsonp_domain_url_2", 1523 | type: 4, 1524 | commandments:"敏感域名请求: 腾讯视频支付接口", 1525 | ruleposition: 1, 1526 | rulecontent: /pay.video.qq.com/im 1527 | }, 1528 | { 1529 | rulename: "h98_fuckjsonp_domain_url_3", 1530 | type: 4, 1531 | commandments:"敏感域名请求: 苏宁易购接口", 1532 | ruleposition: 1, 1533 | rulecontent: /myjr.suning.com/im 1534 | }, 1535 | { 1536 | rulename: "h99_fuckjsonp_domain_url_4", 1537 | type: 4, 1538 | commandments:"敏感域名请求: 苏宁易购登录接口", 1539 | ruleposition: 1, 1540 | rulecontent: /loginst.suning.com/im 1541 | }, 1542 | { 1543 | rulename: "h100_fuckjsonp_domain_url_5", 1544 | type: 4, 1545 | commandments:"敏感域名请求: 凤凰游戏域名接口", 1546 | ruleposition: 1, 1547 | rulecontent: /www.fhyx.com/im 1548 | }, 1549 | { 1550 | rulename: "h101_fuckjsonp_domain_url_6", 1551 | type: 4, 1552 | commandments:"敏感域名请求: 有妖气原创漫画搜索接口", 1553 | ruleposition: 1, 1554 | rulecontent: /so.u17.com/im 1555 | }, 1556 | { 1557 | rulename: "h102_fuckjsonp_domain_url_7", 1558 | type: 4, 1559 | commandments:"敏感域名请求: 爱学术域名接口", 1560 | ruleposition: 1, 1561 | rulecontent: /www.ixueshu.com/im 1562 | }, 1563 | { 1564 | rulename: "h103_fuckjsonp_domain_url_8", 1565 | type: 4, 1566 | commandments:"敏感域名请求: 豆瓣网接口", 1567 | ruleposition: 1, 1568 | rulecontent: /www.douban.com/im 1569 | }, 1570 | { 1571 | rulename: "h104_fuckjsonp_domain_url_9", 1572 | type: 4, 1573 | commandments:"敏感域名请求: 迅雷下载接口", 1574 | ruleposition: 1, 1575 | rulecontent: /yuancheng.xunlei.com/im 1576 | }, 1577 | { 1578 | rulename: "h105_fuckjsonp_domain_url_10", 1579 | type: 4, 1580 | commandments:"敏感域名请求: 百度招商接口", 1581 | ruleposition: 1, 1582 | rulecontent: /istats.baidu.com/im 1583 | }, 1584 | { 1585 | rulename: "h106_fuckjsonp_domain_url_11", 1586 | type: 4, 1587 | commandments:"敏感域名请求: 运营商[联通]接口", 1588 | ruleposition: 1, 1589 | rulecontent: /10010.com/im 1590 | }, 1591 | { 1592 | rulename: "h107_fuckjsonp_domain_url_12", 1593 | type: 4, 1594 | commandments:"敏感域名请求: 运营商[移动]接口", 1595 | ruleposition: 1, 1596 | rulecontent: /10086.cn/im 1597 | }, 1598 | { 1599 | rulename: "h108_fuckjsonp_domain_url_13", 1600 | type: 4, 1601 | commandments:"敏感域名请求: 运营商[电信]接口1", 1602 | ruleposition: 1, 1603 | rulecontent: /189.cn/im 1604 | }, 1605 | { 1606 | rulename: "h109_fuckjsonp_domain_url_14", 1607 | type: 4, 1608 | commandments:"敏感域名请求: 运营商[电信]接口2", 1609 | ruleposition: 1, 1610 | rulecontent: /chinatelecom.com.cn/im 1611 | }, 1612 | { 1613 | rulename: "h110_heimdallr_js_url_1", 1614 | type: 5, 1615 | commandments:"敏感关键词: 请求URL参数中存在jsonp常用关键词callback", 1616 | ruleposition: 1, 1617 | rulecontent: /\?.+callback\=/im 1618 | }, 1619 | { 1620 | rulename: "h111_heimdallr_js_url_2", 1621 | type: 5, 1622 | commandments:"敏感关键词: 请求URL参数中存在jsonp常用关键词eval和atob", 1623 | ruleposition: 1, 1624 | rulecontent: /\?.+eval\(atob/im 1625 | }, 1626 | { 1627 | rulename: "h112_heimdallr_js_url_3", 1628 | type: 5, 1629 | commandments:"敏感关键词: 请求URL参数中存在jsonp常用关键词jsonp", 1630 | ruleposition: 1, 1631 | rulecontent: /\?.+jsonp/im 1632 | }, 1633 | { 1634 | rulename: "h113_heimdallr_domain_url_4", 1635 | type: 4, 1636 | commandments:"敏感域名请求: 超星用户接口", 1637 | ruleposition: 1, 1638 | rulecontent: /passport2.chaoxing.com/im 1639 | }, 1640 | { 1641 | rulename: "h114_heimdallr_domain_url_5", 1642 | type: 4, 1643 | commandments:"敏感域名请求: 百度接口5-百度账号及设备信息接口", 1644 | ruleposition: 1, 1645 | rulecontent: /sofire.baidu.com/im 1646 | }, 1647 | { 1648 | rulename: "h115_heimdallr_domain_url_6", 1649 | type: 4, 1650 | commandments:"敏感域名请求: 百度接口6-百度教育接口", 1651 | ruleposition: 1, 1652 | rulecontent: /easylearn.baidu.com/im 1653 | }, 1654 | { 1655 | rulename: "h116_heimdallr_domain_url_7", 1656 | type: 4, 1657 | commandments:"敏感域名请求: 百度接口7-百度读书接口", 1658 | ruleposition: 1, 1659 | rulecontent: /yuedu.baidu.com/im 1660 | }, 1661 | { 1662 | rulename: "h117_heimdallr_domain_url_8", 1663 | type: 4, 1664 | commandments:"敏感域名请求: 58同城账号接口", 1665 | ruleposition: 1, 1666 | rulecontent: /employer.58.com/im 1667 | }, 1668 | { 1669 | rulename: "h118_heimdallr_domain_url_9", 1670 | type: 4, 1671 | commandments:"敏感域名请求: 腾讯QQ接口3-u.y.qq.com", 1672 | ruleposition: 1, 1673 | rulecontent: /u.y.qq.com/im 1674 | }, 1675 | { 1676 | rulename: "h119_heimdallr_domain_url_10", 1677 | type: 4, 1678 | commandments:"敏感域名请求: 超星慕课接口", 1679 | ruleposition: 1, 1680 | rulecontent: /mooc1-1.chaoxing.com/im 1681 | }, 1682 | { 1683 | rulename: "h120_heimdallr_domain_url_11", 1684 | type: 4, 1685 | commandments:"敏感域名请求: 58同城账号接口2", 1686 | ruleposition: 1, 1687 | rulecontent: /passport.58.com/im 1688 | }, 1689 | { 1690 | rulename: "h121_heimdallr_domain_url_12", 1691 | type: 4, 1692 | commandments:"敏感域名请求: 优酷接口3-download.youku.com", 1693 | ruleposition: 1, 1694 | rulecontent: /download.youku.com/im 1695 | }, 1696 | { 1697 | rulename: "h122_heimdallr_domain_url_13", 1698 | type: 4, 1699 | commandments:"敏感域名请求: 新浪爱问知识人接口2", 1700 | ruleposition: 1, 1701 | rulecontent: /static.iask.cn/im 1702 | }, 1703 | { 1704 | rulename: "h123_heimdallr_domain_url_14", 1705 | type: 4, 1706 | commandments:"敏感域名请求: 苏宁易购账号接口", 1707 | ruleposition: 1, 1708 | rulecontent: /passport.suning.com/im 1709 | }, 1710 | { 1711 | rulename: "h124_heimdallr_domain_url_15", 1712 | type: 4, 1713 | commandments:"敏感域名请求: 百度接口8-百度资源服务器接口", 1714 | ruleposition: 1, 1715 | rulecontent: /sofire.bdstatic.com/im 1716 | }, 1717 | { 1718 | rulename: "h125_heimdallr_domain_url_16", 1719 | type: 4, 1720 | commandments:"敏感域名请求: 百度接口9-百度网盟推广接口", 1721 | ruleposition: 1, 1722 | rulecontent: /cbjs.baidu.com/im 1723 | }, 1724 | { 1725 | rulename: "h126_heimdallr_domain_url_17", 1726 | type: 4, 1727 | commandments:"敏感域名请求: 新浪爱问知识人接口3", 1728 | ruleposition: 1, 1729 | rulecontent: /static3.iask.cn/im 1730 | }, 1731 | { 1732 | rulename: "h127_heimdallr_domain_url_18", 1733 | type: 4, 1734 | commandments:"敏感域名请求: 百度接口10-百度系移动端接口", 1735 | ruleposition: 1, 1736 | rulecontent: /sfp.safe.baidu.com/im 1737 | }, 1738 | { 1739 | rulename: "h128_heimdallr_domain_url_19", 1740 | type: 4, 1741 | commandments:"敏感域名请求: 新浪爱问知识人接口4-IP及归属地信息接口", 1742 | ruleposition: 1, 1743 | rulecontent: /ipip.iask.cn/im 1744 | }, 1745 | { 1746 | rulename: "h129_heimdallr_js_url_20", 1747 | type: 3, 1748 | commandments:"蜜罐资源特征: 加载HFish特征资源[w-logo-blue.png]", 1749 | ruleposition: 1, 1750 | rulecontent: /w\-logo\-blue\.png\?ver/im 1751 | }, 1752 | { 1753 | rulename: "h130_heimdallr_domain_url_21", 1754 | type: 4, 1755 | commandments:"敏感域名请求: 百度接口11-百度hao123接口", 1756 | ruleposition: 1, 1757 | rulecontent: /wapsite.baidu.com/im 1758 | }, 1759 | { 1760 | rulename: "h131_heimdallr_js_url_22", 1761 | type: 3, 1762 | commandments:"敏感脚本调用: 加载特征识别脚本[fingerprint.js]", 1763 | ruleposition: 1, 1764 | rulecontent: /fingerprint2\.min\.js/im 1765 | }, 1766 | { 1767 | rulename: "h132_heimdallr_js_url_23", 1768 | type: 5, 1769 | commandments:"敏感脚本调用: Url检测到敏感脚本关键字[fingerprintjs]", 1770 | ruleposition: 1, 1771 | rulecontent: /fingerprintjs/im 1772 | }, 1773 | { 1774 | rulename: "h133_heimdallr_js_url_24", 1775 | type: 3, 1776 | commandments:"敏感脚本调用: 加载蜜罐热点溯源jsonp脚本", 1777 | ruleposition: 1, 1778 | rulecontent: /monitordevinfo\/common\.js/im 1779 | }, 1780 | { 1781 | rulename: "h134_heimdallr_domain_url_25", 1782 | type: 4, 1783 | commandments:"敏感域名请求: 访问蜜罐子框架请求域名hackit.me", 1784 | ruleposition: 1, 1785 | rulecontent: /hackit.me/im 1786 | }, 1787 | { 1788 | rulename: "h135_heimdallr_domain_url_26", 1789 | type: 4, 1790 | commandments:"敏感域名请求: 访问蜜罐JS脚本资源域名sloss.xyz", 1791 | ruleposition: 1, 1792 | rulecontent: /sloss.xyz/im 1793 | }, 1794 | { 1795 | rulename: "h136_heimdallr_domain_url_27", 1796 | type: 3, 1797 | commandments:"敏感域名请求: 网站请求Burpsuite自带浏览器静态资源特征", 1798 | ruleposition: 1, 1799 | rulecontent: /burp/im 1800 | }, 1801 | { 1802 | rulename: "h137_heimdallr_domain_url_28", 1803 | type: 4, 1804 | commandments:"敏感域名请求: 移动认证接口-可用于热点溯源手机号", 1805 | ruleposition: 1, 1806 | rulecontent: /cmpassport.com/im 1807 | }, 1808 | { 1809 | rulename: "h138_heimdallr_domain_url_29", 1810 | type: 4, 1811 | commandments:"敏感域名请求: 电信天翼认证接口-可用于热点溯源手机号", 1812 | ruleposition: 1, 1813 | rulecontent: /id6.me/im 1814 | }, 1815 | { 1816 | rulename: "h139_heimdallr_domain_url_30", 1817 | type: 4, 1818 | commandments:"敏感域名请求: 电信认证接口2-可用于热点溯源手机号", 1819 | ruleposition: 1, 1820 | rulecontent: /open.e.189.cn/im 1821 | }, 1822 | { 1823 | rulename: "h140_heimdallr_domain_url_31", 1824 | type: 4, 1825 | commandments:"敏感域名请求: 联通认证接口-可用于热点溯源手机号", 1826 | ruleposition: 1, 1827 | rulecontent: /wostore.cn/im 1828 | }, 1829 | { 1830 | rulename: "h141_heimdallr_domain_url_32", 1831 | type: 4, 1832 | commandments:"敏感域名请求: 联通开发者平台接口-可用于热点溯源手机号", 1833 | ruleposition: 1, 1834 | rulecontent: /mdn.open.wo.cn/im 1835 | }, 1836 | { 1837 | rulename: "h142_heimdallr_domain_url_33", 1838 | type: 4, 1839 | commandments:"敏感域名请求: 联通认证接口2-可用于热点溯源手机号", 1840 | ruleposition: 1, 1841 | rulecontent: /enrichgw.10010.com/im 1842 | }, 1843 | { 1844 | rulename: "h143_heimdallr_domain_url_34", 1845 | type: 4, 1846 | commandments:"敏感域名请求: 联通认证接口3-可用于热点溯源手机号", 1847 | ruleposition: 1, 1848 | rulecontent: /auth.wosms.cn/im 1849 | }, 1850 | { 1851 | rulename: "h144_heimdallr_domain_url_35", 1852 | type: 4, 1853 | commandments:"敏感域名请求: 联通认证接口4-可用于热点溯源手机号", 1854 | ruleposition: 1, 1855 | rulecontent: /id.mail.wo.cn/im 1856 | }, 1857 | { 1858 | rulename: "h145_heimdallr_domain_url_36", 1859 | type: 4, 1860 | commandments:"敏感域名请求: 联通认证接口5-可用于热点溯源手机号", 1861 | ruleposition: 1, 1862 | rulecontent: /hmrz.wo.cn/im 1863 | }, 1864 | { 1865 | rulename: "h146_heimdallr_domain_url_37", 1866 | type: 4, 1867 | commandments:"敏感域名请求: 联通认证接口6-可用于热点溯源手机号", 1868 | ruleposition: 1, 1869 | rulecontent: /nisportal.10010.com/im 1870 | }, 1871 | { 1872 | rulename: "h147_heimdallr_domain_url_38", 1873 | type: 4, 1874 | commandments:"敏感域名请求: 联通认证接口7-可用于热点溯源手机号", 1875 | ruleposition: 1, 1876 | rulecontent: /nishub1.10010.com/im 1877 | }, 1878 | { 1879 | rulename: "h148_heimdallr_domain_url_39", 1880 | type: 4, 1881 | commandments:"敏感域名请求: 中卓信移动认证接口-可用于热点溯源手机号", 1882 | ruleposition: 1, 1883 | rulecontent: /zzx9.cn/im 1884 | }, 1885 | { 1886 | rulename: "h149_heimdallr_domain_url_40", 1887 | type: 4, 1888 | commandments:"敏感域名请求: 阿里淘宝网接口3-淘宝官网接口", 1889 | ruleposition: 1, 1890 | rulecontent: /www.taobao.com/im 1891 | }, 1892 | { 1893 | rulename: "h150_heimdallr_domain_url_41", 1894 | type: 4, 1895 | commandments:"敏感域名请求: 起点中文网", 1896 | ruleposition: 1, 1897 | rulecontent: /qidian.com/im 1898 | }, 1899 | { 1900 | rulename: "h151_heimdallr_domain_url_42", 1901 | type: 4, 1902 | commandments:"敏感域名请求: YY直播", 1903 | ruleposition: 1, 1904 | rulecontent: /yy.com/im 1905 | }, 1906 | { 1907 | rulename: "h152_heimdallr_domain_url_43", 1908 | type: 4, 1909 | commandments:"敏感域名请求: 新浪接口3-mix.sina.com.cn", 1910 | ruleposition: 1, 1911 | rulecontent: /mix.sina.com.cn/im 1912 | }, 1913 | 1914 | 1915 | 1916 | 1917 | 1918 | 1919 | 1920 | 1921 | 1922 | 1923 | 1924 | ] 1925 | 1926 | 1927 | 1928 | 1929 | 1930 | 1931 | //================================================================================================= 1932 | //================================================================================================= 1933 | //================================================================================================= 1934 | 1935 | 1936 | 1937 | 1938 | // 插件读取的规则列表 1939 | var HPrinter = null 1940 | 1941 | // 插件拦截的蜜罐jsonp类请求规则 1942 | var HBlockingDomainRules = null 1943 | 1944 | 1945 | function initPrinter(){ 1946 | HPrinter = {"position1" : [], "position2" : [], "position3" : [], "position4" : [], "position5" : []} 1947 | 1948 | HBlockingDomainRules = [] 1949 | 1950 | let tmpIndex = 1 1951 | 1952 | for ( let i of printerData ) { 1953 | 1954 | if (i.ruleposition == 1) { 1955 | HPrinter.position1.push(i) 1956 | } else if (i.ruleposition == 2){ 1957 | HPrinter.position2.push(i) 1958 | } else if (i.ruleposition == 3){ 1959 | HPrinter.position3.push(i) 1960 | } else if (i.ruleposition == 4){ 1961 | HPrinter.position4.push(i) 1962 | } else if (i.ruleposition == 5){ 1963 | HPrinter.position5.push(i) 1964 | } 1965 | 1966 | if (i.type == 4) { 1967 | let tmpDomain = ("" + i.rulecontent).split('/')[1] 1968 | if (tmpDomain != null && tmpDomain.search(/\S*?\.\S*?/im) == 0) { 1969 | let tmpBlockingRule = {} 1970 | tmpBlockingRule.id = tmpIndex 1971 | tmpBlockingRule.priority = 1 1972 | tmpBlockingRule.action = { "type": "block" }, 1973 | tmpBlockingRule.condition = {"requestDomains" : [tmpDomain], "resourceTypes" : ["main_frame", "sub_frame", "stylesheet", "script", "image", "font", "object", "xmlhttprequest", "ping", "csp_report", "media", "websocket", "webtransport", "webbundle", "other"]} 1974 | HBlockingDomainRules.push(tmpBlockingRule) 1975 | tmpIndex++ 1976 | } 1977 | } else if (i.type == 3) { 1978 | let tmpDomain = ("" + i.rulecontent).split('/')[1].replace(/\\/g,"") 1979 | if (tmpDomain != null && tmpDomain != "") { 1980 | let tmpBlockingRule = {} 1981 | tmpBlockingRule.id = tmpIndex 1982 | tmpBlockingRule.priority = 1 1983 | tmpBlockingRule.action = { "type": "block" }, 1984 | tmpBlockingRule.condition = {"urlFilter" : tmpDomain, "resourceTypes" : ["main_frame", "sub_frame", "stylesheet", "script", "image", "font", "object", "xmlhttprequest", "ping", "csp_report", "media", "websocket", "webtransport", "webbundle", "other"]} 1985 | HBlockingDomainRules.push(tmpBlockingRule) 1986 | tmpIndex++ 1987 | } 1988 | } 1989 | } 1990 | } 1991 | 1992 | initPrinter() -------------------------------------------------------------------------------- /Heimdallr/resource/img/icon/ico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ghr07h/Heimdallr/d28dc0cc2a319bf1e324ea73309967add7c10bd2/Heimdallr/resource/img/icon/ico.png -------------------------------------------------------------------------------- /Heimdallr/resource/inject/content.js: -------------------------------------------------------------------------------- 1 | function initInject() { 2 | const OriginalToBlob = HTMLCanvasElement.prototype.toBlob 3 | const OriginalToDataURL = HTMLCanvasElement.prototype.toDataURL 4 | const OriginalGetImageData = CanvasRenderingContext2D.prototype.getImageData 5 | 6 | const randomRGBA = { 7 | 'r': Math.floor(Math.random() * 255), 8 | 'g': Math.floor(Math.random() * 255), 9 | 'b': Math.floor(Math.random() * 255), 10 | 'a': Math.floor(Math.random() * 255) 11 | } 12 | 13 | var interfere = function (canvaselement, context2d) { 14 | if (context2d) { 15 | const width = canvaselement.width; 16 | const height = canvaselement.height; 17 | 18 | if (width && height) { 19 | // [左顶点横坐标,左顶点纵坐标,矩形宽度,矩形高度] 20 | const imageData = OriginalGetImageData.apply(context2d, [0, 0, width, height]); 21 | for (let i = 0; i < height; i++) { 22 | for (let j = 0; j < width; j++) { 23 | // rgba(255,255,255,1) [255.255.255.255] 24 | const n = ((i * (width * 4)) + (j * 4)); 25 | imageData.data[n + 0] = ((imageData.data[n + 0] + randomRGBA.r)>=255)?(imageData.data[n + 0] + randomRGBA.r - 255):(imageData.data[n + 0] + randomRGBA.r) 26 | imageData.data[n + 1] = ((imageData.data[n + 1] + randomRGBA.g)>=255)?(imageData.data[n + 1] + randomRGBA.r - 255):(imageData.data[n + 1] + randomRGBA.r) 27 | imageData.data[n + 2] = ((imageData.data[n + 2] + randomRGBA.b)>=255)?(imageData.data[n + 2] + randomRGBA.r - 255):(imageData.data[n + 2] + randomRGBA.r) 28 | imageData.data[n + 3] = ((imageData.data[n + 3] + randomRGBA.a)>=255)?(imageData.data[n + 3] + randomRGBA.r - 255):(imageData.data[n + 3] + randomRGBA.r) 29 | } 30 | } 31 | // (要放回画布的 ImageData 对象,左顶点横坐标,左顶点纵坐标) 32 | context2d.putImageData(imageData, 0, 0); 33 | } 34 | } 35 | } 36 | 37 | // HTMLCanvasElement toBlob 38 | Object.defineProperty(HTMLCanvasElement.prototype, "toBlob", {"value": function () { 39 | interfere(this, this.getContext("2d")); 40 | return OriginalToBlob.apply(this, arguments); 41 | } 42 | }) 43 | Object.defineProperty(HTMLCanvasElement.prototype.toBlob, "length", {"value": 1}); 44 | Object.defineProperty(HTMLCanvasElement.prototype.toBlob, "toString", {"value": () => "function toBlob() { [native code] }"}); 45 | Object.defineProperty(HTMLCanvasElement.prototype.toBlob, "name", {"value": "toBlob"}); 46 | 47 | // HTMLCanvasElement toDataURL 48 | Object.defineProperty(HTMLCanvasElement.prototype, "toDataURL", {"value": function () { 49 | interfere(this, this.getContext("2d")); 50 | return OriginalToDataURL.apply(this, arguments); 51 | } 52 | }) 53 | Object.defineProperty(HTMLCanvasElement.prototype.toDataURL, "length", {"value": 0}) 54 | Object.defineProperty(HTMLCanvasElement.prototype.toDataURL, "toString", {"value": () => "function toDataURL() { [native code] }"}) 55 | Object.defineProperty(HTMLCanvasElement.prototype.toDataURL, "name", {"value": "toDataURL"}) 56 | 57 | 58 | // CanvasRenderingContext2D getImageData 59 | Object.defineProperty(CanvasRenderingContext2D.prototype, "getImageData", {"value": function () { 60 | interfere(this.canvas, this); 61 | return OriginalGetImageData.apply(this, arguments) 62 | } 63 | }) 64 | Object.defineProperty(CanvasRenderingContext2D.prototype.getImageData, "length", {"value": 4}) 65 | Object.defineProperty(CanvasRenderingContext2D.prototype.getImageData, "toString", {"value": () => "function getImageData() { [native code] }"}) 66 | Object.defineProperty(CanvasRenderingContext2D.prototype.getImageData, "name", {"value": "getImageData"}) 67 | } 68 | 69 | 70 | initInject() 71 | -------------------------------------------------------------------------------- /Heimdallr/resource/inject/inject.js: -------------------------------------------------------------------------------- 1 | const script = document.createElement('script'); 2 | script.src = chrome.runtime.getURL("/resource/inject/content.js"); 3 | document.documentElement.appendChild(script); 4 | -------------------------------------------------------------------------------- /Heimdallr/resource/popup/ico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ghr07h/Heimdallr/d28dc0cc2a319bf1e324ea73309967add7c10bd2/Heimdallr/resource/popup/ico.png -------------------------------------------------------------------------------- /Heimdallr/resource/popup/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Heimdallr 8 | 16 | 17 | 18 | 19 | 20 |

21 | 22 | 23 | -------------------------------------------------------------------------------- /Heimdallr程序逻辑.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ghr07h/Heimdallr/d28dc0cc2a319bf1e324ea73309967add7c10bd2/Heimdallr程序逻辑.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /README.assets/404logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ghr07h/Heimdallr/d28dc0cc2a319bf1e324ea73309967add7c10bd2/README.assets/404logo.png -------------------------------------------------------------------------------- /README.assets/image-20220814220214770.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ghr07h/Heimdallr/d28dc0cc2a319bf1e324ea73309967add7c10bd2/README.assets/image-20220814220214770.png -------------------------------------------------------------------------------- /README.assets/image-20220818000347564.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ghr07h/Heimdallr/d28dc0cc2a319bf1e324ea73309967add7c10bd2/README.assets/image-20220818000347564.png -------------------------------------------------------------------------------- /README.assets/image-20221017093032294.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ghr07h/Heimdallr/d28dc0cc2a319bf1e324ea73309967add7c10bd2/README.assets/image-20221017093032294.png -------------------------------------------------------------------------------- /README.assets/image-20221017154419189.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ghr07h/Heimdallr/d28dc0cc2a319bf1e324ea73309967add7c10bd2/README.assets/image-20221017154419189.png -------------------------------------------------------------------------------- /README.assets/image-20221017154934546.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ghr07h/Heimdallr/d28dc0cc2a319bf1e324ea73309967add7c10bd2/README.assets/image-20221017154934546.png -------------------------------------------------------------------------------- /README.assets/image-20221104111153079.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ghr07h/Heimdallr/d28dc0cc2a319bf1e324ea73309967add7c10bd2/README.assets/image-20221104111153079.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Heimdallr 2 | 3 | ## ⚡介绍 4 | 5 | **Heimdallr**是一款致力于被动嗅探浏览器流量,用于**提示漏洞框架指纹**、**告警拦截蜜罐请求**、**对抗浏览器特征追踪**(浏览器持久化、webRTC、Canvas画布等)的Chrome插件。 6 | 7 | ![image-20221017154419189](README.assets/image-20221017154419189.png) 8 | 9 | ![image-20221017154934546](README.assets/image-20221017154934546.png) 10 | 11 | ## 🥑安装 12 | 13 | 1. GitHub Releases 下载插件最新编译版本 14 | 2. Chrome浏览器-扩展设置-开发者模式-加载已解压的扩展程序 15 | 16 | ![image-20221017154934546](README.assets/image-20221104111153079.png) 17 | 18 | > 注意:Chrome版本需高于Chrome v96,部分代码逻辑不适配edge和firefox,请勿混用于非Chrome浏览器 19 | 20 | ## 🚀使用 21 | 22 | ### 基本功能 23 | 24 | 高危漏洞资产指纹识别和蜜罐jsonp请求识别功能无需配置,只要插件开启即可生效。 25 | 26 | - 高危漏洞资产指纹识别规则103条,涉及框架或产品如下: 27 | 28 | > ueditor、struts2、spring、weblogic、shiro、F5 BIG-IP、致远OA、用友NC、用友畅捷通、通达OA、心通达OA、新点OA、帆软报表、蓝凌OA、红帆OA、华天动力OA、万户OA、金蝶云、协众OA、金和OA、海昌OA、泛微多个产品(ecology、eoffice、ebridge、emobile)、拓尔思SSO、拓尔思内容管理系统、亿邮邮件、coremail邮件、Exchange邮件、若依后台管理系统、Wordpress、小鱼易连云视讯、tomcat、iis、jboss、jetty、ibm websphere、weblogic、thinkphp、showdoc、Laravel、kindeditor、fckeditor、ewebeditor、jeesite、海康威视多个产品(网络摄像头、安防管理平台、图像综合应用平台)、dedecms、jira、confluence、java web、博达站群、dubbo、向日葵客户端、宝塔waf、宝塔面板、米拓cms、teleport堡垒机、齐治堡垒机、帕拉迪堡垒机、H3C堡垒机、绿盟防火墙、安全狗Waf 29 | 30 | - 蜜罐特征告警规则151条,涉及敏感域名请求(jsonp)、蜜罐网页资源特征、蜜罐对本机特殊软件(如Burpsuite)的探测请求、网站流量分析与跟踪请求、敏感关键词、敏感脚本调用等。 31 | 32 | > 为了保证请求的最全面捕获,Heimdallr中不进行请求种类(如script、XMLHttpRequest等)的筛选,因此插件默认只进行蜜罐请求识别而不作拦截,若开启蜜罐请求拦截会影响正常访问CSDN、Github等网站的正常访问,可以通过日常使用时暂停插件(控制-暂停/开启插件)或关闭蜜罐拦截功能(策略配置-蜜罐拦截配置)解决。 33 | > 34 | > 因部分框架或产品(如百度网站在线客服会调用5个敏感域名、高德地图嵌入会调用高德域名)的正常使用也会出现Jsonp敏感域名的访问,故同一站点的Jsonp请求超过10个时,基本可以确定为蜜罐站点,此时将会出现系统弹窗告警(弹窗需要操作系统开启浏览器弹窗权限,该权限默认开启)。低于10个的敏感域名请求,使用者可根据当前站点内容和告警域名的关联度进行判断,例如某个小企业官网可能调用百度商桥接口实现在线客服功能,但一般不会调用虎牙直播账号接口或联通一键登录热点溯源接口。 35 | 36 | ### 控制 37 | 38 | 右上角三个选项分别为暂停/开启插件、清除所有嗅探结果集、设置选项。 39 | 40 | > 暂停插件后,会清空所有页面的嗅探结果集,关闭对请求和响应的监听,扩展功能中仅WebRTC防护功能不关闭,其他的功能都会随插件暂停而暂停。 41 | 42 | ### 扩展功能 43 | 44 | 扩展功能由策略配置页面配置 45 | 46 | ![image-20221017093032294](README.assets/image-20221017093032294.png) 47 | 48 | #### 被动识别配置-启用响应体规则匹配 49 | 50 | - 建议设置:仅在攻击期间对需高度关注页面(口子、靶标)开启该选项,用完即关 51 | 52 | > 默认情况下,被动嗅探只对请求响应的URL、Request Header、Request Body、Response Header进行匹配,仅有较少部分高危指纹在Response Body中检测,开启该选项后会启用devtools调用chrome devtools protocol,检测Response Body中的指纹。但是启用该选项后会出现调试提示栏,如需关闭参考高级-4 53 | 54 | #### 被动识别配置-关闭浏览器页面缓存(强制刷新) 55 | 56 | - 建议设置:默认开启该选项 57 | 58 | > 部分包含特征规则的静态资源(如JS文件)会在一次调用后存储在磁盘中,减少重复加载耗费的流量和带宽。这会导致识别规则在重复刷新页面是不会重复触发。开启该选项后可以达到更完善的特征识别,这也可以防止部分情况下静态资源文件不能及时更新导致的访问异常 59 | 60 | #### 蜜罐拦截配置-符合蜜罐特征请求自动拦截 61 | 62 | - 建议设置:攻击期间开启,日常使用时关闭 63 | 64 | > 为保证能够识别、阻断部分新的Jsonp请求,插件按照请求域名进行拦截,这会导致开启该选项后访问部分日常网站(CSDN、GitHub等)会被阻断,影响日常访问。因此默认情况下插件不会拦截疑似蜜罐的Jsonp请求,需要手动开启拦截选项.日常网站被拦截也可以通过右上角的暂停插件按钮暂停,访问结束后重新启动插件。但是更建议的方式为日常使用浏览器和攻击使用浏览器分离开来,专事专用 65 | 66 | #### 特征对抗配置-清除所有浏览器持久化项数据 67 | 68 | - 建议设置:在被cookie追踪或其他持久化手段追踪浏览器特征时清除数据 69 | 70 | > 清除的浏览器持久化项包括:网站应用缓存(appcache)、网站资源缓存、网站缓存存储、Cookie、网络文件系统、表单数据记录、索引数据库(indexDB)、localStorage、密码记录、网络SQL数据(webSQL) 71 | > 72 | > **警告**:清除的数据中包含密码记录,即浏览器的密码管理器的记录。如果你使用浏览器自带的密码管理器和Google账号进行密码记录和维护,清除浏览器的密码管理器记录可能导致Google账号同步的密码被置空。再次建议将攻击主机和日常使用的主机分离,不在攻击主机上登录或保存任何私人有关的账号。 73 | 74 | #### 特征对抗配置-WebRTC 防IP泄露严格策略 75 | 76 | - 建议设置:安装后手动开启该选项 77 | 78 | > 通过提高WebRTC策略严格度防止真实IP泄露,已知Chrome v104(截至2022.9.1)仍存在该漏洞,此选项可在并建议在日常使用时也开启 79 | > 请勿将此策略与其他WebRTC防护插件(如WebRTC Control或WebRTC Leak Prevent)同时使用,各插件调节WebRTC策略会互相干涉,暂停其他插件的使用时的API调用也会影响Heimdallr的调节逻辑。 80 | 81 | #### 特征对抗配置-Canves噪点干扰脚本注入 82 | 83 | - 建议设置:攻击期间开启,日常使用时关闭 84 | 85 | > 通过对当前网页注入内容脚本增加Canvas画布噪点防止特征锁定,开启后所有网页访问时将会额外加载content.js用于画布类的函数hook操作 86 | 87 | 88 | 89 | ## 🔔高级 90 | 91 | 1. 插件的识别对象基于【标签页】,标签页页面变更【(域名+端口)或(IP+端口)】时清空结果,切换标签页时结果会暂存,关闭标签页或窗口时删除对应结果。 92 | 2. 插件默认只存在被动流量监控,不会因为敏感指纹的识别触发防火墙处置。 93 | 3. 插件识别结果为页面及页面子框架的请求内容,部分页面告警【请求体数据为json格式】、【请求头Content-Type为application/json格式】时,不一定是当前document的请求,有可能是当前document页加载的相关页面的接口请求匹配了规则. 94 | 4. 因为谷歌Chrome API的安全限制和Chrome内核的历史遗留问题,插件对响应体Body的检查与其他指纹位置的检查不同,浏览器页面顶部会出现调试提示,可通过插件设置关闭响应包检查功能或添加谷歌浏览器的启动项规避提示(在Chrome快捷方式右键打开属性,在快捷方式栏的【目标】框添加启动参数 `--silent-debugger-extension-api`)。 95 | 5. 插件目的为发现直接访问无法识别的组件或框架,请勿添加可以直接识别的组件的特征到指纹库(如spark未授权页面),增加无意义的识别流程导致识别负担增加。 96 | 97 | 98 | ## 🎇继续开发 99 | 100 | #### 新增指纹 101 | 102 | 在实战中遇到有意义的高危指纹特征或未在拦截列表中的蜜罐请求特征都可以打开新的issue提交,作者会尽快在验证可用性后将指纹添加到新的版本中。 103 | 104 | #### 二次开发 105 | 106 | Vue3前端模块 107 | 108 | ``` 109 | cd Vue_popup\heimdallr_v3 110 | npm install 111 | npm run build:watch 112 | vim src\App.vue 113 | ``` 114 | 115 | chrome插件模块 116 | 117 | ``` 118 | cd .\Heimdallr\ 119 | ``` 120 | 121 | 指纹模块 122 | 123 | ``` 124 | cd .\Heimdallr\resource\data 125 | vim data.js 126 | ``` 127 | 128 | ## ⭐404星链计划 129 | 130 | ![image-20221017093032294](README.assets/404logo.png) 131 | 132 | **Heimdallr** 现已加入 [404星链计划](https://github.com/knownsec/404StarLink) 133 | 134 | ## ✨项目Star趋势 135 | 136 | [![Stargazers over time](https://starchart.cc/graynjo/Heimdallr.svg)](https://starchart.cc/graynjo/Heimdallr) 137 | 138 | 139 | ## 🎊致谢 140 | 141 | https://github.com/iiiusky/AntiHoneypot-Chrome-simple 142 | 143 | https://github.com/cnrstar/anti-honeypot 144 | 145 | https://github.com/Monyer/antiHoneyPot 146 | 147 | https://github.com/fuckjsonp/FuckJsonp-RCE-CVE-2022-26809-SQL-XSS-FuckJsonp 148 | 149 | https://github.com/aghorler/WebRTC-Leak-Prevent 150 | 151 | https://github.com/NS-Sp4ce/MoAn_Honey_Pot_Urls 152 | 153 | https://github.com/EdgeSecurityTeam/EHole 154 | 155 | https://mybrowseraddon.com/canvas-defender.html 156 | 157 | https://github.com/fuckhoneypot/fuckhoneypot 158 | 159 | ## 💡许可证 160 | 161 | 使用 GPL V2 协议发行,详情参见LICENSE -------------------------------------------------------------------------------- /Vue_popup/heimdallr_v3/README.md: -------------------------------------------------------------------------------- 1 | # heimdallr_v3 2 | 3 | This template should help get you started developing with Vue 3 in Vite. 4 | 5 | ## Recommended IDE Setup 6 | 7 | [VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin). 8 | 9 | ## Customize configuration 10 | 11 | See [Vite Configuration Reference](https://vitejs.dev/config/). 12 | 13 | ## Project Setup 14 | 15 | ```sh 16 | npm install 17 | ``` 18 | 19 | ### Compile and Hot-Reload for Development 20 | 21 | ```sh 22 | npm run dev 23 | ``` 24 | 25 | ### Compile and Minify for Production 26 | 27 | ```sh 28 | npm run build 29 | ``` 30 | -------------------------------------------------------------------------------- /Vue_popup/heimdallr_v3/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Heimdallr 8 | 16 | 17 | 18 |
19 | 20 | 21 | -------------------------------------------------------------------------------- /Vue_popup/heimdallr_v3/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "heimdallr_v3", 3 | "version": "0.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/parser": { 8 | "version": "7.19.0", 9 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", 10 | "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==" 11 | }, 12 | "@ctrl/tinycolor": { 13 | "version": "3.4.1", 14 | "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz", 15 | "integrity": "sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw==" 16 | }, 17 | "@element-plus/icons-vue": { 18 | "version": "2.0.9", 19 | "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.0.9.tgz", 20 | "integrity": "sha512-okdrwiVeKBmW41Hkl0eMrXDjzJwhQMuKiBOu17rOszqM+LS/yBYpNQNV5Jvoh06Wc+89fMmb/uhzf8NZuDuUaQ==" 21 | }, 22 | "@esbuild/linux-loong64": { 23 | "version": "0.15.7", 24 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.7.tgz", 25 | "integrity": "sha512-IKznSJOsVUuyt7cDzzSZyqBEcZe+7WlBqTVXiF1OXP/4Nm387ToaXZ0fyLwI1iBlI/bzpxVq411QE2/Bt2XWWw==", 26 | "dev": true, 27 | "optional": true 28 | }, 29 | "@floating-ui/core": { 30 | "version": "1.0.1", 31 | "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.0.1.tgz", 32 | "integrity": "sha512-bO37brCPfteXQfFY0DyNDGB3+IMe4j150KFQcgJ5aBP295p9nBGeHEs/p0czrRbtlHq4Px/yoPXO/+dOCcF4uA==" 33 | }, 34 | "@floating-ui/dom": { 35 | "version": "1.0.1", 36 | "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.0.1.tgz", 37 | "integrity": "sha512-wBDiLUKWU8QNPNOTAFHiIAkBv1KlHauG2AhqjSeh2H+wR8PX+AArXfz8NkRexH5PgMJMmSOS70YS89AbWYh5dA==", 38 | "requires": { 39 | "@floating-ui/core": "^1.0.1" 40 | } 41 | }, 42 | "@popperjs/core": { 43 | "version": "npm:@sxzz/popperjs-es@2.11.7", 44 | "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", 45 | "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==" 46 | }, 47 | "@types/lodash": { 48 | "version": "4.14.184", 49 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.184.tgz", 50 | "integrity": "sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==" 51 | }, 52 | "@types/lodash-es": { 53 | "version": "4.17.6", 54 | "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.6.tgz", 55 | "integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==", 56 | "requires": { 57 | "@types/lodash": "*" 58 | } 59 | }, 60 | "@types/web-bluetooth": { 61 | "version": "0.0.15", 62 | "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.15.tgz", 63 | "integrity": "sha512-w7hEHXnPMEZ+4nGKl/KDRVpxkwYxYExuHOYXyzIzCDzEZ9ZCGMAewulr9IqJu2LR4N37fcnb1XVeuZ09qgOxhA==" 64 | }, 65 | "@vitejs/plugin-vue": { 66 | "version": "3.1.0", 67 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.1.0.tgz", 68 | "integrity": "sha512-fmxtHPjSOEIRg6vHYDaem+97iwCUg/uSIaTzp98lhELt2ISOQuDo2hbkBdXod0g15IhfPMQmAxh4heUks2zvDA==", 69 | "dev": true 70 | }, 71 | "@vue/compiler-core": { 72 | "version": "3.2.38", 73 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.38.tgz", 74 | "integrity": "sha512-/FsvnSu7Z+lkd/8KXMa4yYNUiqQrI22135gfsQYVGuh5tqEgOB0XqrUdb/KnCLa5+TmQLPwvyUnKMyCpu+SX3Q==", 75 | "requires": { 76 | "@babel/parser": "^7.16.4", 77 | "@vue/shared": "3.2.38", 78 | "estree-walker": "^2.0.2", 79 | "source-map": "^0.6.1" 80 | } 81 | }, 82 | "@vue/compiler-dom": { 83 | "version": "3.2.38", 84 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.38.tgz", 85 | "integrity": "sha512-zqX4FgUbw56kzHlgYuEEJR8mefFiiyR3u96498+zWPsLeh1WKvgIReoNE+U7gG8bCUdvsrJ0JRmev0Ky6n2O0g==", 86 | "requires": { 87 | "@vue/compiler-core": "3.2.38", 88 | "@vue/shared": "3.2.38" 89 | } 90 | }, 91 | "@vue/compiler-sfc": { 92 | "version": "3.2.38", 93 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.38.tgz", 94 | "integrity": "sha512-KZjrW32KloMYtTcHAFuw3CqsyWc5X6seb8KbkANSWt3Cz9p2qA8c1GJpSkksFP9ABb6an0FLCFl46ZFXx3kKpg==", 95 | "requires": { 96 | "@babel/parser": "^7.16.4", 97 | "@vue/compiler-core": "3.2.38", 98 | "@vue/compiler-dom": "3.2.38", 99 | "@vue/compiler-ssr": "3.2.38", 100 | "@vue/reactivity-transform": "3.2.38", 101 | "@vue/shared": "3.2.38", 102 | "estree-walker": "^2.0.2", 103 | "magic-string": "^0.25.7", 104 | "postcss": "^8.1.10", 105 | "source-map": "^0.6.1" 106 | } 107 | }, 108 | "@vue/compiler-ssr": { 109 | "version": "3.2.38", 110 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.38.tgz", 111 | "integrity": "sha512-bm9jOeyv1H3UskNm4S6IfueKjUNFmi2kRweFIGnqaGkkRePjwEcfCVqyS3roe7HvF4ugsEkhf4+kIvDhip6XzQ==", 112 | "requires": { 113 | "@vue/compiler-dom": "3.2.38", 114 | "@vue/shared": "3.2.38" 115 | } 116 | }, 117 | "@vue/reactivity": { 118 | "version": "3.2.38", 119 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.38.tgz", 120 | "integrity": "sha512-6L4myYcH9HG2M25co7/BSo0skKFHpAN8PhkNPM4xRVkyGl1K5M3Jx4rp5bsYhvYze2K4+l+pioN4e6ZwFLUVtw==", 121 | "requires": { 122 | "@vue/shared": "3.2.38" 123 | } 124 | }, 125 | "@vue/reactivity-transform": { 126 | "version": "3.2.38", 127 | "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.38.tgz", 128 | "integrity": "sha512-3SD3Jmi1yXrDwiNJqQ6fs1x61WsDLqVk4NyKVz78mkaIRh6d3IqtRnptgRfXn+Fzf+m6B1KxBYWq1APj6h4qeA==", 129 | "requires": { 130 | "@babel/parser": "^7.16.4", 131 | "@vue/compiler-core": "3.2.38", 132 | "@vue/shared": "3.2.38", 133 | "estree-walker": "^2.0.2", 134 | "magic-string": "^0.25.7" 135 | } 136 | }, 137 | "@vue/runtime-core": { 138 | "version": "3.2.38", 139 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.38.tgz", 140 | "integrity": "sha512-kk0qiSiXUU/IKxZw31824rxmFzrLr3TL6ZcbrxWTKivadoKupdlzbQM4SlGo4MU6Zzrqv4fzyUasTU1jDoEnzg==", 141 | "requires": { 142 | "@vue/reactivity": "3.2.38", 143 | "@vue/shared": "3.2.38" 144 | } 145 | }, 146 | "@vue/runtime-dom": { 147 | "version": "3.2.38", 148 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.38.tgz", 149 | "integrity": "sha512-4PKAb/ck2TjxdMSzMsnHViOrrwpudk4/A56uZjhzvusoEU9xqa5dygksbzYepdZeB5NqtRw5fRhWIiQlRVK45A==", 150 | "requires": { 151 | "@vue/runtime-core": "3.2.38", 152 | "@vue/shared": "3.2.38", 153 | "csstype": "^2.6.8" 154 | } 155 | }, 156 | "@vue/server-renderer": { 157 | "version": "3.2.38", 158 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.38.tgz", 159 | "integrity": "sha512-pg+JanpbOZ5kEfOZzO2bt02YHd+ELhYP8zPeLU1H0e7lg079NtuuSB8fjLdn58c4Ou8UQ6C1/P+528nXnLPAhA==", 160 | "requires": { 161 | "@vue/compiler-ssr": "3.2.38", 162 | "@vue/shared": "3.2.38" 163 | } 164 | }, 165 | "@vue/shared": { 166 | "version": "3.2.38", 167 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.38.tgz", 168 | "integrity": "sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg==" 169 | }, 170 | "@vueuse/core": { 171 | "version": "9.2.0", 172 | "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.2.0.tgz", 173 | "integrity": "sha512-/MZ6qpz6uSyaXrtoeBWQzAKRG3N7CvfVWvQxiM3ei3Xe5ydOjjtVbo7lGl9p8dECV93j7W8s63A8H0kFLpLyxg==", 174 | "requires": { 175 | "@types/web-bluetooth": "^0.0.15", 176 | "@vueuse/metadata": "9.2.0", 177 | "@vueuse/shared": "9.2.0", 178 | "vue-demi": "*" 179 | } 180 | }, 181 | "@vueuse/metadata": { 182 | "version": "9.2.0", 183 | "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.2.0.tgz", 184 | "integrity": "sha512-exN4KE6iquxDCdt72BgEhb3tlOpECtD61AUdXnUqBTIUCl70x1Ar/QXo3bYcvxmdMS2/peQyfeTzBjRTpvL5xw==" 185 | }, 186 | "@vueuse/shared": { 187 | "version": "9.2.0", 188 | "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.2.0.tgz", 189 | "integrity": "sha512-NnRp/noSWuXW0dKhZK5D0YLrDi0nmZ18UeEgwXQq7Ul5TTP93lcNnKjrHtd68j2xFB/l59yPGFlCryL692bnrA==", 190 | "requires": { 191 | "vue-demi": "*" 192 | } 193 | }, 194 | "abbrev": { 195 | "version": "1.1.1", 196 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 197 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 198 | "dev": true 199 | }, 200 | "anymatch": { 201 | "version": "3.1.2", 202 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 203 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 204 | "dev": true, 205 | "requires": { 206 | "normalize-path": "^3.0.0", 207 | "picomatch": "^2.0.4" 208 | } 209 | }, 210 | "async-validator": { 211 | "version": "4.2.5", 212 | "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", 213 | "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" 214 | }, 215 | "balanced-match": { 216 | "version": "1.0.2", 217 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 218 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 219 | "dev": true 220 | }, 221 | "binary-extensions": { 222 | "version": "2.2.0", 223 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 224 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 225 | "dev": true 226 | }, 227 | "brace-expansion": { 228 | "version": "1.1.11", 229 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 230 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 231 | "dev": true, 232 | "requires": { 233 | "balanced-match": "^1.0.0", 234 | "concat-map": "0.0.1" 235 | } 236 | }, 237 | "braces": { 238 | "version": "3.0.2", 239 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 240 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 241 | "dev": true, 242 | "requires": { 243 | "fill-range": "^7.0.1" 244 | } 245 | }, 246 | "chokidar": { 247 | "version": "3.5.3", 248 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 249 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 250 | "dev": true, 251 | "requires": { 252 | "anymatch": "~3.1.2", 253 | "braces": "~3.0.2", 254 | "fsevents": "~2.3.2", 255 | "glob-parent": "~5.1.2", 256 | "is-binary-path": "~2.1.0", 257 | "is-glob": "~4.0.1", 258 | "normalize-path": "~3.0.0", 259 | "readdirp": "~3.6.0" 260 | } 261 | }, 262 | "concat-map": { 263 | "version": "0.0.1", 264 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 265 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 266 | "dev": true 267 | }, 268 | "csstype": { 269 | "version": "2.6.20", 270 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", 271 | "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" 272 | }, 273 | "dayjs": { 274 | "version": "1.11.5", 275 | "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.5.tgz", 276 | "integrity": "sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==" 277 | }, 278 | "debug": { 279 | "version": "3.2.7", 280 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 281 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 282 | "dev": true, 283 | "requires": { 284 | "ms": "^2.1.1" 285 | } 286 | }, 287 | "element-plus": { 288 | "version": "2.2.16", 289 | "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.2.16.tgz", 290 | "integrity": "sha512-rvaTMFIujec9YDC5lyaiQv2XVUCHuhVDq2k+9vQxP78N8Wd07iEOGa9pvEVOO2uYc75l4rSl2RE/IWPH/6Mdzw==", 291 | "requires": { 292 | "@ctrl/tinycolor": "^3.4.1", 293 | "@element-plus/icons-vue": "^2.0.6", 294 | "@floating-ui/dom": "^1.0.1", 295 | "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", 296 | "@types/lodash": "^4.14.182", 297 | "@types/lodash-es": "^4.17.6", 298 | "@vueuse/core": "^9.1.0", 299 | "async-validator": "^4.2.5", 300 | "dayjs": "^1.11.3", 301 | "escape-html": "^1.0.3", 302 | "lodash": "^4.17.21", 303 | "lodash-es": "^4.17.21", 304 | "lodash-unified": "^1.0.2", 305 | "memoize-one": "^6.0.0", 306 | "normalize-wheel-es": "^1.2.0" 307 | } 308 | }, 309 | "esbuild": { 310 | "version": "0.15.7", 311 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.7.tgz", 312 | "integrity": "sha512-7V8tzllIbAQV1M4QoE52ImKu8hT/NLGlGXkiDsbEU5PS6K8Mn09ZnYoS+dcmHxOS9CRsV4IRAMdT3I67IyUNXw==", 313 | "dev": true, 314 | "requires": { 315 | "@esbuild/linux-loong64": "0.15.7", 316 | "esbuild-android-64": "0.15.7", 317 | "esbuild-android-arm64": "0.15.7", 318 | "esbuild-darwin-64": "0.15.7", 319 | "esbuild-darwin-arm64": "0.15.7", 320 | "esbuild-freebsd-64": "0.15.7", 321 | "esbuild-freebsd-arm64": "0.15.7", 322 | "esbuild-linux-32": "0.15.7", 323 | "esbuild-linux-64": "0.15.7", 324 | "esbuild-linux-arm": "0.15.7", 325 | "esbuild-linux-arm64": "0.15.7", 326 | "esbuild-linux-mips64le": "0.15.7", 327 | "esbuild-linux-ppc64le": "0.15.7", 328 | "esbuild-linux-riscv64": "0.15.7", 329 | "esbuild-linux-s390x": "0.15.7", 330 | "esbuild-netbsd-64": "0.15.7", 331 | "esbuild-openbsd-64": "0.15.7", 332 | "esbuild-sunos-64": "0.15.7", 333 | "esbuild-windows-32": "0.15.7", 334 | "esbuild-windows-64": "0.15.7", 335 | "esbuild-windows-arm64": "0.15.7" 336 | } 337 | }, 338 | "esbuild-android-64": { 339 | "version": "0.15.7", 340 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.7.tgz", 341 | "integrity": "sha512-p7rCvdsldhxQr3YHxptf1Jcd86dlhvc3EQmQJaZzzuAxefO9PvcI0GLOa5nCWem1AJ8iMRu9w0r5TG8pHmbi9w==", 342 | "dev": true, 343 | "optional": true 344 | }, 345 | "esbuild-android-arm64": { 346 | "version": "0.15.7", 347 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.7.tgz", 348 | "integrity": "sha512-L775l9ynJT7rVqRM5vo+9w5g2ysbOCfsdLV4CWanTZ1k/9Jb3IYlQ06VCI1edhcosTYJRECQFJa3eAvkx72eyQ==", 349 | "dev": true, 350 | "optional": true 351 | }, 352 | "esbuild-darwin-64": { 353 | "version": "0.15.7", 354 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.7.tgz", 355 | "integrity": "sha512-KGPt3r1c9ww009t2xLB6Vk0YyNOXh7hbjZ3EecHoVDxgtbUlYstMPDaReimKe6eOEfyY4hBEEeTvKwPsiH5WZg==", 356 | "dev": true, 357 | "optional": true 358 | }, 359 | "esbuild-darwin-arm64": { 360 | "version": "0.15.7", 361 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.7.tgz", 362 | "integrity": "sha512-kBIHvtVqbSGajN88lYMnR3aIleH3ABZLLFLxwL2stiuIGAjGlQW741NxVTpUHQXUmPzxi6POqc9npkXa8AcSZQ==", 363 | "dev": true, 364 | "optional": true 365 | }, 366 | "esbuild-freebsd-64": { 367 | "version": "0.15.7", 368 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.7.tgz", 369 | "integrity": "sha512-hESZB91qDLV5MEwNxzMxPfbjAhOmtfsr9Wnuci7pY6TtEh4UDuevmGmkUIjX/b+e/k4tcNBMf7SRQ2mdNuK/HQ==", 370 | "dev": true, 371 | "optional": true 372 | }, 373 | "esbuild-freebsd-arm64": { 374 | "version": "0.15.7", 375 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.7.tgz", 376 | "integrity": "sha512-dLFR0ChH5t+b3J8w0fVKGvtwSLWCv7GYT2Y2jFGulF1L5HftQLzVGN+6pi1SivuiVSmTh28FwUhi9PwQicXI6Q==", 377 | "dev": true, 378 | "optional": true 379 | }, 380 | "esbuild-linux-32": { 381 | "version": "0.15.7", 382 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.7.tgz", 383 | "integrity": "sha512-v3gT/LsONGUZcjbt2swrMjwxo32NJzk+7sAgtxhGx1+ZmOFaTRXBAi1PPfgpeo/J//Un2jIKm/I+qqeo4caJvg==", 384 | "dev": true, 385 | "optional": true 386 | }, 387 | "esbuild-linux-64": { 388 | "version": "0.15.7", 389 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.7.tgz", 390 | "integrity": "sha512-LxXEfLAKwOVmm1yecpMmWERBshl+Kv5YJ/1KnyAr6HRHFW8cxOEsEfisD3sVl/RvHyW//lhYUVSuy9jGEfIRAQ==", 391 | "dev": true, 392 | "optional": true 393 | }, 394 | "esbuild-linux-arm": { 395 | "version": "0.15.7", 396 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.7.tgz", 397 | "integrity": "sha512-JKgAHtMR5f75wJTeuNQbyznZZa+pjiUHV7sRZp42UNdyXC6TiUYMW/8z8yIBAr2Fpad8hM1royZKQisqPABPvQ==", 398 | "dev": true, 399 | "optional": true 400 | }, 401 | "esbuild-linux-arm64": { 402 | "version": "0.15.7", 403 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.7.tgz", 404 | "integrity": "sha512-P3cfhudpzWDkglutWgXcT2S7Ft7o2e3YDMrP1n0z2dlbUZghUkKCyaWw0zhp4KxEEzt/E7lmrtRu/pGWnwb9vw==", 405 | "dev": true, 406 | "optional": true 407 | }, 408 | "esbuild-linux-mips64le": { 409 | "version": "0.15.7", 410 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.7.tgz", 411 | "integrity": "sha512-T7XKuxl0VpeFLCJXub6U+iybiqh0kM/bWOTb4qcPyDDwNVhLUiPcGdG2/0S7F93czUZOKP57YiLV8YQewgLHKw==", 412 | "dev": true, 413 | "optional": true 414 | }, 415 | "esbuild-linux-ppc64le": { 416 | "version": "0.15.7", 417 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.7.tgz", 418 | "integrity": "sha512-6mGuC19WpFN7NYbecMIJjeQgvDb5aMuvyk0PDYBJrqAEMkTwg3Z98kEKuCm6THHRnrgsdr7bp4SruSAxEM4eJw==", 419 | "dev": true, 420 | "optional": true 421 | }, 422 | "esbuild-linux-riscv64": { 423 | "version": "0.15.7", 424 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.7.tgz", 425 | "integrity": "sha512-uUJsezbswAYo/X7OU/P+PuL/EI9WzxsEQXDekfwpQ23uGiooxqoLFAPmXPcRAt941vjlY9jtITEEikWMBr+F/g==", 426 | "dev": true, 427 | "optional": true 428 | }, 429 | "esbuild-linux-s390x": { 430 | "version": "0.15.7", 431 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.7.tgz", 432 | "integrity": "sha512-+tO+xOyTNMc34rXlSxK7aCwJgvQyffqEM5MMdNDEeMU3ss0S6wKvbBOQfgd5jRPblfwJ6b+bKiz0g5nABpY0QQ==", 433 | "dev": true, 434 | "optional": true 435 | }, 436 | "esbuild-netbsd-64": { 437 | "version": "0.15.7", 438 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.7.tgz", 439 | "integrity": "sha512-yVc4Wz+Pu3cP5hzm5kIygNPrjar/v5WCSoRmIjCPWfBVJkZNb5brEGKUlf+0Y759D48BCWa0WHrWXaNy0DULTQ==", 440 | "dev": true, 441 | "optional": true 442 | }, 443 | "esbuild-openbsd-64": { 444 | "version": "0.15.7", 445 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.7.tgz", 446 | "integrity": "sha512-GsimbwC4FSR4lN3wf8XmTQ+r8/0YSQo21rWDL0XFFhLHKlzEA4SsT1Tl8bPYu00IU6UWSJ+b3fG/8SB69rcuEQ==", 447 | "dev": true, 448 | "optional": true 449 | }, 450 | "esbuild-sunos-64": { 451 | "version": "0.15.7", 452 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.7.tgz", 453 | "integrity": "sha512-8CDI1aL/ts0mDGbWzjEOGKXnU7p3rDzggHSBtVryQzkSOsjCHRVe0iFYUuhczlxU1R3LN/E7HgUO4NXzGGP/Ag==", 454 | "dev": true, 455 | "optional": true 456 | }, 457 | "esbuild-windows-32": { 458 | "version": "0.15.7", 459 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.7.tgz", 460 | "integrity": "sha512-cOnKXUEPS8EGCzRSFa1x6NQjGhGsFlVgjhqGEbLTPsA7x4RRYiy2RKoArNUU4iR2vHmzqS5Gr84MEumO/wxYKA==", 461 | "dev": true, 462 | "optional": true 463 | }, 464 | "esbuild-windows-64": { 465 | "version": "0.15.7", 466 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.7.tgz", 467 | "integrity": "sha512-7MI08Ec2sTIDv+zH6StNBKO+2hGUYIT42GmFyW6MBBWWtJhTcQLinKS6ldIN1d52MXIbiJ6nXyCJ+LpL4jBm3Q==", 468 | "dev": true, 469 | "optional": true 470 | }, 471 | "esbuild-windows-arm64": { 472 | "version": "0.15.7", 473 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.7.tgz", 474 | "integrity": "sha512-R06nmqBlWjKHddhRJYlqDd3Fabx9LFdKcjoOy08YLimwmsswlFBJV4rXzZCxz/b7ZJXvrZgj8DDv1ewE9+StMw==", 475 | "dev": true, 476 | "optional": true 477 | }, 478 | "escape-html": { 479 | "version": "1.0.3", 480 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 481 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 482 | }, 483 | "estree-walker": { 484 | "version": "2.0.2", 485 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 486 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 487 | }, 488 | "fill-range": { 489 | "version": "7.0.1", 490 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 491 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 492 | "dev": true, 493 | "requires": { 494 | "to-regex-range": "^5.0.1" 495 | } 496 | }, 497 | "fsevents": { 498 | "version": "2.3.2", 499 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 500 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 501 | "dev": true, 502 | "optional": true 503 | }, 504 | "function-bind": { 505 | "version": "1.1.1", 506 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 507 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 508 | "dev": true 509 | }, 510 | "glob-parent": { 511 | "version": "5.1.2", 512 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 513 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 514 | "dev": true, 515 | "requires": { 516 | "is-glob": "^4.0.1" 517 | } 518 | }, 519 | "has": { 520 | "version": "1.0.3", 521 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 522 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 523 | "dev": true, 524 | "requires": { 525 | "function-bind": "^1.1.1" 526 | } 527 | }, 528 | "has-flag": { 529 | "version": "3.0.0", 530 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 531 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 532 | "dev": true 533 | }, 534 | "ignore-by-default": { 535 | "version": "1.0.1", 536 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 537 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", 538 | "dev": true 539 | }, 540 | "is-binary-path": { 541 | "version": "2.1.0", 542 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 543 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 544 | "dev": true, 545 | "requires": { 546 | "binary-extensions": "^2.0.0" 547 | } 548 | }, 549 | "is-core-module": { 550 | "version": "2.10.0", 551 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", 552 | "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", 553 | "dev": true, 554 | "requires": { 555 | "has": "^1.0.3" 556 | } 557 | }, 558 | "is-extglob": { 559 | "version": "2.1.1", 560 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 561 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 562 | "dev": true 563 | }, 564 | "is-glob": { 565 | "version": "4.0.3", 566 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 567 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 568 | "dev": true, 569 | "requires": { 570 | "is-extglob": "^2.1.1" 571 | } 572 | }, 573 | "is-number": { 574 | "version": "7.0.0", 575 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 576 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 577 | "dev": true 578 | }, 579 | "lodash": { 580 | "version": "4.17.21", 581 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 582 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 583 | }, 584 | "lodash-es": { 585 | "version": "4.17.21", 586 | "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", 587 | "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" 588 | }, 589 | "lodash-unified": { 590 | "version": "1.0.2", 591 | "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.2.tgz", 592 | "integrity": "sha512-OGbEy+1P+UT26CYi4opY4gebD8cWRDxAT6MAObIVQMiqYdxZr1g3QHWCToVsm31x2NkLS4K3+MC2qInaRMa39g==" 593 | }, 594 | "magic-string": { 595 | "version": "0.25.9", 596 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", 597 | "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", 598 | "requires": { 599 | "sourcemap-codec": "^1.4.8" 600 | } 601 | }, 602 | "memoize-one": { 603 | "version": "6.0.0", 604 | "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", 605 | "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" 606 | }, 607 | "minimatch": { 608 | "version": "3.1.2", 609 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 610 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 611 | "dev": true, 612 | "requires": { 613 | "brace-expansion": "^1.1.7" 614 | } 615 | }, 616 | "ms": { 617 | "version": "2.1.3", 618 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 619 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 620 | "dev": true 621 | }, 622 | "nanoid": { 623 | "version": "3.3.4", 624 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 625 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" 626 | }, 627 | "nodemon": { 628 | "version": "2.0.19", 629 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz", 630 | "integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==", 631 | "dev": true, 632 | "requires": { 633 | "chokidar": "^3.5.2", 634 | "debug": "^3.2.7", 635 | "ignore-by-default": "^1.0.1", 636 | "minimatch": "^3.0.4", 637 | "pstree.remy": "^1.1.8", 638 | "semver": "^5.7.1", 639 | "simple-update-notifier": "^1.0.7", 640 | "supports-color": "^5.5.0", 641 | "touch": "^3.1.0", 642 | "undefsafe": "^2.0.5" 643 | } 644 | }, 645 | "nopt": { 646 | "version": "1.0.10", 647 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 648 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", 649 | "dev": true, 650 | "requires": { 651 | "abbrev": "1" 652 | } 653 | }, 654 | "normalize-path": { 655 | "version": "3.0.0", 656 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 657 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 658 | "dev": true 659 | }, 660 | "normalize-wheel-es": { 661 | "version": "1.2.0", 662 | "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", 663 | "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" 664 | }, 665 | "path-parse": { 666 | "version": "1.0.7", 667 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 668 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 669 | "dev": true 670 | }, 671 | "picocolors": { 672 | "version": "1.0.0", 673 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 674 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 675 | }, 676 | "picomatch": { 677 | "version": "2.3.1", 678 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 679 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 680 | "dev": true 681 | }, 682 | "postcss": { 683 | "version": "8.4.16", 684 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", 685 | "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", 686 | "requires": { 687 | "nanoid": "^3.3.4", 688 | "picocolors": "^1.0.0", 689 | "source-map-js": "^1.0.2" 690 | } 691 | }, 692 | "pstree.remy": { 693 | "version": "1.1.8", 694 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 695 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 696 | "dev": true 697 | }, 698 | "readdirp": { 699 | "version": "3.6.0", 700 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 701 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 702 | "dev": true, 703 | "requires": { 704 | "picomatch": "^2.2.1" 705 | } 706 | }, 707 | "resolve": { 708 | "version": "1.22.1", 709 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 710 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 711 | "dev": true, 712 | "requires": { 713 | "is-core-module": "^2.9.0", 714 | "path-parse": "^1.0.7", 715 | "supports-preserve-symlinks-flag": "^1.0.0" 716 | } 717 | }, 718 | "rollup": { 719 | "version": "2.78.1", 720 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", 721 | "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", 722 | "dev": true, 723 | "requires": { 724 | "fsevents": "~2.3.2" 725 | } 726 | }, 727 | "semver": { 728 | "version": "5.7.1", 729 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 730 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 731 | "dev": true 732 | }, 733 | "simple-update-notifier": { 734 | "version": "1.0.7", 735 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", 736 | "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", 737 | "dev": true, 738 | "requires": { 739 | "semver": "~7.0.0" 740 | }, 741 | "dependencies": { 742 | "semver": { 743 | "version": "7.0.0", 744 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", 745 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", 746 | "dev": true 747 | } 748 | } 749 | }, 750 | "source-map": { 751 | "version": "0.6.1", 752 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 753 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 754 | }, 755 | "source-map-js": { 756 | "version": "1.0.2", 757 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 758 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" 759 | }, 760 | "sourcemap-codec": { 761 | "version": "1.4.8", 762 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 763 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" 764 | }, 765 | "supports-color": { 766 | "version": "5.5.0", 767 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 768 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 769 | "dev": true, 770 | "requires": { 771 | "has-flag": "^3.0.0" 772 | } 773 | }, 774 | "supports-preserve-symlinks-flag": { 775 | "version": "1.0.0", 776 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 777 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 778 | "dev": true 779 | }, 780 | "to-regex-range": { 781 | "version": "5.0.1", 782 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 783 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 784 | "dev": true, 785 | "requires": { 786 | "is-number": "^7.0.0" 787 | } 788 | }, 789 | "touch": { 790 | "version": "3.1.0", 791 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 792 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 793 | "dev": true, 794 | "requires": { 795 | "nopt": "~1.0.10" 796 | } 797 | }, 798 | "undefsafe": { 799 | "version": "2.0.5", 800 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 801 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", 802 | "dev": true 803 | }, 804 | "vite": { 805 | "version": "3.1.0", 806 | "resolved": "https://registry.npmjs.org/vite/-/vite-3.1.0.tgz", 807 | "integrity": "sha512-YBg3dUicDpDWFCGttmvMbVyS9ydjntwEjwXRj2KBFwSB8SxmGcudo1yb8FW5+M/G86aS8x828ujnzUVdsLjs9g==", 808 | "dev": true, 809 | "requires": { 810 | "esbuild": "^0.15.6", 811 | "fsevents": "~2.3.2", 812 | "postcss": "^8.4.16", 813 | "resolve": "^1.22.1", 814 | "rollup": "~2.78.0" 815 | } 816 | }, 817 | "vue": { 818 | "version": "3.2.38", 819 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.38.tgz", 820 | "integrity": "sha512-hHrScEFSmDAWL0cwO4B6WO7D3sALZPbfuThDsGBebthrNlDxdJZpGR3WB87VbjpPh96mep1+KzukYEhpHDFa8Q==", 821 | "requires": { 822 | "@vue/compiler-dom": "3.2.38", 823 | "@vue/compiler-sfc": "3.2.38", 824 | "@vue/runtime-dom": "3.2.38", 825 | "@vue/server-renderer": "3.2.38", 826 | "@vue/shared": "3.2.38" 827 | } 828 | }, 829 | "vue-demi": { 830 | "version": "0.13.11", 831 | "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", 832 | "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==" 833 | } 834 | } 835 | } 836 | -------------------------------------------------------------------------------- /Vue_popup/heimdallr_v3/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "heimdallr_v3", 3 | "version": "0.0.0", 4 | "scripts": { 5 | "dev": "vite", 6 | "build": "vite build", 7 | "build:watch": "nodemon --watch src --exec npm run build --ext \"ts,vue\"", 8 | "preview": "vite preview --port 4173" 9 | }, 10 | "dependencies": { 11 | "element-plus": "^2.2.16", 12 | "vue": "^3.2.38" 13 | }, 14 | "devDependencies": { 15 | "@vitejs/plugin-vue": "^3.0.3", 16 | "nodemon": "^2.0.19", 17 | "vite": "^3.0.9" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Vue_popup/heimdallr_v3/public/ico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ghr07h/Heimdallr/d28dc0cc2a319bf1e324ea73309967add7c10bd2/Vue_popup/heimdallr_v3/public/ico.png -------------------------------------------------------------------------------- /Vue_popup/heimdallr_v3/src/App.vue: -------------------------------------------------------------------------------- 1 | 216 | 217 | 236 | 237 | 238 | 239 | -------------------------------------------------------------------------------- /Vue_popup/heimdallr_v3/src/assets/ico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ghr07h/Heimdallr/d28dc0cc2a319bf1e324ea73309967add7c10bd2/Vue_popup/heimdallr_v3/src/assets/ico.png -------------------------------------------------------------------------------- /Vue_popup/heimdallr_v3/src/main.js: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import ElementPlus from 'element-plus' 3 | import 'element-plus/dist/index.css' 4 | import App from './App.vue' 5 | 6 | 7 | 8 | 9 | const app = createApp(App) 10 | app.use(ElementPlus) 11 | app.mount('#app') 12 | 13 | 14 | -------------------------------------------------------------------------------- /Vue_popup/heimdallr_v3/vite.config.js: -------------------------------------------------------------------------------- 1 | import { fileURLToPath, URL } from 'node:url' 2 | 3 | import { defineConfig } from 'vite' 4 | import vue from '@vitejs/plugin-vue' 5 | 6 | // https://vitejs.dev/config/ 7 | export default defineConfig({ 8 | plugins: [vue()], 9 | resolve: { 10 | alias: { 11 | '@': fileURLToPath(new URL('./src', import.meta.url)) 12 | } 13 | }, 14 | base: "./", 15 | build: { 16 | outDir: '../../Heimdallr/resource/popup' 17 | }, 18 | }) 19 | --------------------------------------------------------------------------------