HEX
Server: nginx/1.28.3
System: Linux ip-172-31-12-242 6.17.0-1007-aws #7~24.04.1-Ubuntu SMP Thu Jan 22 21:04:49 UTC 2026 x86_64
User: root (0)
PHP: 7.4.33
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/server/panel/BTPanel/static/js/page12.js
import{r as U,o as W,g as Q,c as J,x as c,y as d,A as i,B as v,O as A,G as L,z as r,C as g,F as P,aT as R,D as m,ap as ae,am as se,an as ne,v as oe,J as le,L as $,e as b,R as re,M as ie,ay as ce,b5 as ue}from"./base-lib.js?v=1777008528";import{f as j,ab as de,w as X,t as N,J as u,P as Z,b as he,j as fe,p as _e,a3 as pe,_ as ge}from"./utils-lib.js?v=1777008528";import{u as ye}from"./use-file-editor.js?v=1777008528";import{w as be,ag as me,ah as we,ai as ee,aj as ve,ak as Ce,al as ke,am as Se,an as Pe,ao as xe,ap as Ee,aq as Le,ar as Re,as as Te,s as Ie,A as Ue,at as Oe,au as Ae,av as De,aw as Ne,ax as Me,ay as Be,az as Ve,aA as qe,aB as Fe,aC as He,aD as te,aE as We,aF as je,aG as Ge,aH as $e,aI as ze,aJ as Ye,aK as Ke,aL as Qe,aM as Je,aN as Xe,aO as Ze,aP as et,aQ as tt,aR as at,aS as st,aT as nt,aU as ot,aV as lt,aW as rt,aX as it,aY as ct,aZ as ut,a_ as dt,a$ as ht,b0 as ft,b1 as _t,b2 as pt,b3 as gt,b4 as yt,b5 as bt,b6 as mt,b7 as wt,b8 as vt,b9 as Ct}from"./index432.js?v=1777008528";const D=U(!1);W({});const I=U([]),E=U(""),F=U(!1),T=U("all"),M=W({}),kt=[{key:"anti_cc",label:"防CC攻击"},{key:"access_filter",label:"访问过滤"},{key:"website_vulne_defense",label:"网站漏洞防御"},{key:"sensitive_words",label:"敏感词"}],St=[{key:"cc",name:"CC防御",ps:'防御CC攻击,具体防御参数请到站点配置中调整<a href="https://www.bt.cn/bbs/thread-57581-1-1.html" target="_blank" class="btlink"> &gt;教程</a>',category:"anti_cc",hasSwitch:!0,hasStatusCode:!0,buttons:[{label:"设置规则",action:"dialog",dialogPath:"./dialogs/cc-defense-rule/index.vue"}],fieldPath:"cc",dialogTitle:"设置CC规则"},{key:"cc_tolerate",name:"攻击次数拦截",ps:'封锁连续的恶意攻击请求,请到站点配置中调整阈值<a href="https://www.bt.cn/bbs/thread-57581-1-1.html" target="_blank" class="btlink"> &gt;教程</a>',category:"anti_cc",hasSwitch:!1,hasStatusCode:!0,buttons:[{label:"设置规则",action:"dialog",dialogPath:"./dialogs/attack-retry-rule/index.vue"}],fieldPath:"cc_tolerate",dialogWidth:"420px"},{key:"msg_send",name:"攻击告警",ps:"攻击拦截通过飞书、钉钉、企业微信推送告警",category:"anti_cc",hasSwitch:!0,hasStatusCode:!1,buttons:[{label:"设置",action:"dialog",dialogPath:"./dialogs/attack-alert/index.vue"}],fieldPath:"msg_send",dialogTitle:"设置告警配置",dialogBtn:["确定","取消"]},{key:"static_cc",name:"静态文件防护",ps:'CC防护默认不会防护:JS、CSS、GIF、JPG、JPEG、PNG这几种静态文件,如果不是被刷图片流量不建议一直开启。<a href="https://www.bt.cn/bbs/thread-135541-1-1.html" target="_blank" class="btlink"> &gt;教程</a>',category:"anti_cc",hasSwitch:!0,hasStatusCode:!1,buttons:[],fieldPath:"static_cc"},{key:"btmalibrary",name:"堡塔恶意情报IP库",ps:'<span class="flex"><i class="svgtofont-icon-ltd mr-4px text-ltd !text-large"></i>堡塔恶意IP情报库,获取精准恶意的IP,减少被攻击的风险,企业版免费使用</span>',category:"anti_cc",hasSwitch:!0,hasStatusCode:!1,buttons:[{label:"导出",action:"export",syncApi:"download_charge_malicious_ip"},{label:"同步",action:"sync",syncApi:"get_charge_malicious_ip"}],fieldPath:"btmalibrary"},{key:"share_ip",name:"堡塔免费恶意IP共享库",ps:'加入堡塔免费恶意IP共享计划后方可使用“堡塔免费恶意IP共享库”<a href="https://www.kancloud.cn/kern123/cloudwaf/3208853" target="_blank" class="btlink"> &gt;堡塔免费恶意IP共享库</a>',category:"anti_cc",hasSwitch:!0,hasStatusCode:!1,buttons:[{label:"同步",action:"sync",syncApi:"get_update_malicious_ip"}],fieldPath:"share_ip"},{key:"cc_uri_frequency",name:"单URL CC防御",ps:"单URL的防御CC规则,优先级高于URL白名单",category:"anti_cc",hasSwitch:!1,hasStatusCode:!1,buttons:[{label:"设置",action:"dialog",dialogPath:"./dialogs/single-url-cc/index.vue"}],fieldPath:"cc_uri_frequency"},{key:"url_cc_param",name:"URL增强模式",ps:"独立设置某个URL验证规则",category:"anti_cc",hasSwitch:!1,hasStatusCode:!1,buttons:[{label:"设置",action:"dialog",dialogPath:"./dialogs/url-enhance-mode/index.vue"}],fieldPath:"url_cc_param"},{key:"golbls_cc",name:"人机验证白名单",ps:"开启人机验证时需要不验证某些页面时使用",category:"anti_cc",hasSwitch:!1,hasStatusCode:!1,buttons:[{label:"设置",action:"dialog",dialogPath:"./dialogs/human-verify-whitelist/index.vue"}],fieldPath:"golbls_cc"}],Pt=[{key:"is_browser",name:"非浏览器拦截",ps:'可以防御爬虫攻击、非浏览器访问,当前将应用于所有网站,如果网站开启CDN建议不要开启(存在缓存误报)<a href="https://www.bt.cn/bbs/thread-57585-1-1.html" target="_blank" class="btlink"> &gt;教程</a>',category:"access_filter",hasSwitch:!0,hasStatusCode:!1,buttons:[],fieldPath:"is_browser"},{key:"http_request_filter",name:"HTTP请求过滤",ps:"HTTP请求类型过滤/请求头过滤/语义分析开关",category:"access_filter",hasSwitch:!1,hasStatusCode:!1,buttons:[{label:"设置",action:"dialog",dialogPath:"./dialogs/http-request-filter/index.vue"}],fieldPath:"http_config"},{key:"drop_abroad",name:"禁止国外访问",ps:'禁止中国以外的地区访问站点<a href="https://www.bt.cn/bbs/thread-57588-1-1.html" target="_blank" class="btlink"> &gt;教程</a>',category:"access_filter",hasSwitch:!0,hasStatusCode:!0,buttons:[{label:"同步",action:"sync",syncApi:"sync_cnlist"}],fieldPath:"drop_abroad"},{key:"drop_china",name:"禁止国内访问",ps:'禁止中国区域访问(包括:港、澳、台)<a href="https://www.bt.cn/bbs/thread-57588-1-1.html" target="_blank" class="btlink"> &gt;教程</a>',category:"access_filter",hasSwitch:!0,hasStatusCode:!0,buttons:[{label:"同步",action:"sync",syncApi:"sync_cnlist"}],fieldPath:"drop_china"},{key:"url_method",name:"URL请求类型拦截",ps:"单独设置URL拦截请求类型",category:"access_filter",hasSwitch:!1,hasStatusCode:!1,buttons:[{label:"设置",action:"dialog",dialogPath:"./dialogs/url-request-type/index.vue"}],fieldPath:"url_method"},{key:"api_defense",name:"API接口防御",ps:'此功能是当某些接口存在白名单的情况下,需要对其中一个接口进行CC防御下使用<a href="https://www.bt.cn/bbs/thread-57590-1-1.html" target="_blank" class="btlink"> &gt;教程</a>',category:"access_filter",hasSwitch:!1,hasStatusCode:!1,buttons:[{label:"设置",action:"dialog",dialogPath:"./dialogs/api-defense/index.vue"}],fieldPath:"api_defense"},{key:"spider_pool",name:"蜘蛛池",ps:'默认放行各大搜索引擎蜘蛛爬取,现有蜘蛛分类:百度、谷歌、360、搜狗、雅虎、必应、头条。<a href="https://www.bt.cn/bbs/thread-132479-1-1.html" target="_blank" class="btlink"> &gt;教程</a>',category:"access_filter",hasSwitch:!1,hasStatusCode:!1,buttons:[{label:"同步",action:"sync",syncApi:"get_zhizu_list"},{label:"设置",action:"dialog",dialogPath:"./dialogs/spider-pool/index.vue"}],fieldPath:"spider",dialogTitle:"蜘蛛池列表"}],xt=[{key:"sql_injection",name:"SQL注入防御",ps:'检测恶意SQL语句、防止数据库因SQL注入导致的恶意篡改、删库、数据泄露。<a href="https://www.bt.cn/bbs/thread-57587-1-1.html" target="_blank" class="btlink"> &gt;教程</a><p>注意:若您的网站发布的内容本身会包含SQL语句(如:数据库相关教程类文章),开启此防御可能会导致相关内容的发布被拦截</p>',category:"website_vulne_defense",hasSwitch:!0,hasStatusCode:!0,buttons:[{label:"响应内容",action:"file-editor",filePath:"sql_injection.reqfile"}],fieldPath:"sql_injection",isWideLayout:!0},{key:"xss_injection",name:"XSS防御",ps:'检测XSS语法,防止网页被恶意篡改、用户信息泄露、权限窃取。<a href="https://www.bt.cn/bbs/thread-57587-1-1.html" target="_blank" class="btlink"> &gt;教程</a><p>注意:若您的网站发布的内容本身会包含javascript恶意利用教程,开启此防御可能会导致相关内容的发布被拦截</p>',category:"website_vulne_defense",hasSwitch:!0,hasStatusCode:!0,buttons:[{label:"响应内容",action:"file-editor",filePath:"xss_injection.reqfile"}],fieldPath:"xss_injection",isWideLayout:!0},{key:"rce_injection",name:"命令执行拦截",ps:"通过语法模型判断并拦截潜在的危险命令执行,有效避免黑客通过网站入侵服务器",category:"website_vulne_defense",hasSwitch:!0,hasStatusCode:!0,buttons:[],fieldPath:"rce_injection"},{key:"password",name:"弱密码防御",ps:"实时检测弱密码登录并拦截",category:"website_vulne_defense",hasSwitch:!0,hasStatusCode:!1,buttons:[],fieldPath:"password"},{key:"sensitive_info",name:"敏感信息检测",ps:"拦截报错信息中的敏感信息,包括SQL报错、PHP报错等",category:"website_vulne_defense",hasSwitch:!0,hasStatusCode:!1,buttons:[],fieldPath:"sensitive_info"},{key:"file_upload",name:"恶意文件上传防御",ps:'检测恶意文件上传,防止被上传木马、防止服务器权限丢失。<a href="https://www.bt.cn/bbs/thread-57590-1-1.html" target="_blank" class="btlink"> &gt;教程</a><p>注意:若您在文件上传时、文件名带有php关键词、开启此防御可能会导致IP被封锁</p>',category:"website_vulne_defense",hasSwitch:!0,hasStatusCode:!0,buttons:[{label:"响应内容",action:"file-editor",filePath:"file_upload.reqfile"},{label:"设置",action:"dialog",dialogPath:"./dialogs/file-upload-config/index.vue"}],fieldPath:"file_upload",isWideLayout:!0},{key:"get",name:"恶意下载防御",ps:'检测恶意下载,防止备份文件、源代码、其他关键数据被下载。<a href="https://www.bt.cn/bbs/thread-57587-1-1.html" target="_blank" class="btlink"> &gt;教程</a><p>注意:若您需要通过网站下载备份文件时、若压缩包带有网站名称,开启此防御可能会导致下载文件被拦截,可以通过面板下载</p>',category:"website_vulne_defense",hasSwitch:!0,hasStatusCode:!0,buttons:[{label:"响应内容",action:"file-editor",filePath:"get.reqfile"},{label:"设置规则",action:"dialog",dialogPath:"./dialogs/rule-table/index.vue"}],fieldPath:"get",isWideLayout:!0,dialogWidth:"800px",dialogTitle:"编辑【恶意下载防御】"},{key:"other_rule",name:"自定义规则拦截",ps:'检测php代码执行、检测目录探测、检测ssrf探测、及自定义检测。<a href="https://www.bt.cn/bbs/thread-57589-1-1.html" target="_blank" class="btlink"> &gt;教程</a><p>注意:当前规则可以编辑,默认为GET/POST请求方式都会生效</p>',category:"website_vulne_defense",hasSwitch:!0,hasStatusCode:!0,buttons:[{label:"响应内容",action:"file-editor",filePath:"other_rule.reqfile"},{label:"设置规则",action:"dialog",dialogPath:"./dialogs/rule-table/index.vue"}],fieldPath:"other_rule",isWideLayout:!0,dialogWidth:"800px",dialogTitle:"编辑【自定义规则拦截】"},{key:"user-agent",name:"恶意爬虫防御",ps:'检测恶意爬虫,防止恶意爬虫、访问网站。<a href="https://www.bt.cn/bbs/thread-57587-1-1.html" target="_blank" class="btlink"> &gt;教程</a><p>注意:若您的网站需要被搜索引擎收录,一定不要把搜索引擎的特征加入当中</p>',category:"website_vulne_defense",hasSwitch:!0,hasStatusCode:!0,buttons:[{label:"响应内容",action:"file-editor",filePath:"user-agent.reqfile"},{label:"设置规则",action:"dialog",dialogPath:"./dialogs/rule-table/index.vue"}],fieldPath:"user-agent",isWideLayout:!0,dialogWidth:"800px",dialogTitle:"编辑【恶意爬虫防御】"},{key:"cookie",name:"恶意Cookie防御",ps:'检测Cookie中是否包含恶意代码、SQL注入、XSS攻击。<a href="https://www.bt.cn/bbs/thread-57587-1-1.html" target="_blank" class="btlink"> &gt;教程</a>',category:"website_vulne_defense",hasSwitch:!0,hasStatusCode:!0,buttons:[{label:"响应内容",action:"file-editor",filePath:"cookie.reqfile"},{label:"设置规则",action:"dialog",dialogPath:"./dialogs/rule-table/index.vue"}],fieldPath:"cookie",isWideLayout:!0,dialogWidth:"800px",dialogTitle:"编辑【恶意Cookie防御】"},{key:"scan",name:"恶意扫描器防御",ps:'检测恶意扫描器,防止各类扫描器、木马连接工具、访问网站。<a href="https://www.bt.cn/bbs/thread-57587-1-1.html" target="_blank" class="btlink"> &gt;教程</a><p>注意:若您的网站做安全测试时、可能会被拦截</p>',category:"website_vulne_defense",hasSwitch:!0,hasStatusCode:!0,buttons:[{label:"设置",action:"dialog",dialogPath:"./dialogs/scan-rule/index.vue"}],fieldPath:"scan"},{key:"scan_conf",name:"目录扫描防御",ps:"防止目录/文件被扫描、通过访问的404状态码进行统计拦截。注意:如您的网页很多404图片时、可能会导致访问被拦截",category:"website_vulne_defense",hasSwitch:!0,hasStatusCode:!0,buttons:[{label:"设置",action:"dialog",dialogPath:"./dialogs/dir-scan-defense/index.vue"}],fieldPath:"scan_conf",dialogWidth:"420px"},{key:"webshell_opens",name:"木马查杀",ps:"通过实时访问的文件进行查杀木马,结果在木马隔离箱页面,建议不要关闭此功能。注意:如您的正常文件被拉入到隔离箱中,请在隔离箱中加白",category:"website_vulne_defense",hasSwitch:!0,hasStatusCode:!1,buttons:[],fieldPath:"webshell_opens"},{key:"http_open",name:"日志记录",ps:'默认防火墙只记录1M以内的HTTP拦截数据包、如您需要记录更大的数据包则打开此功能<a href="https://www.bt.cn/bbs/thread-57590-1-1.html" target="_blank" class="btlink"> &gt;教程</a>',category:"website_vulne_defense",hasSwitch:!0,hasStatusCode:!1,buttons:[],fieldPath:"http_open"}],Et=[{key:"body_character_string",name:"敏感文字替换",ps:'替换设置的敏感文字,如果安装了堡塔网站加速则此功能会无效<a href="https://www.bt.cn/bbs/thread-57590-1-1.html" target="_blank" class="btlink"> &gt;教程</a>',category:"sensitive_words",hasSwitch:!1,hasStatusCode:!1,buttons:[{label:"设置",action:"dialog",dialogPath:"./dialogs/sensitive-text/index.vue"}],fieldPath:"body_character_string"},{key:"url_keyword_block",name:"URL关键词拦截",ps:'从URL中拦截关键词<a href="https://www.bt.cn/bbs/thread-57590-1-1.html" target="_blank" class="btlink"> &gt;教程</a>',category:"sensitive_words",hasSwitch:!1,hasStatusCode:!1,buttons:[{label:"设置",action:"dialog",dialogPath:"./dialogs/url-keyword-block/index.vue"}],fieldPath:"url_keyword_block"},{key:"body_intercept",name:"违禁词拦截",ps:'拦截文本中违禁的文字或词组<a href="https://www.bt.cn/bbs/thread-57590-1-1.html" target="_blank" class="btlink"> &gt;教程</a>',category:"sensitive_words",hasSwitch:!1,hasStatusCode:!1,buttons:[{label:"设置",action:"dialog",dialogPath:"./dialogs/banned-words/index.vue"}],fieldPath:"body_intercept"}],Lt=[...St,...Pt,...xt,...Et],Rt=["继承:全局设置将在站点配置中自动继承为默认值","优先级:IP白名单 > IP黑名单 > UA白名单 > URL白名单 > UA黑名单 > URL黑名单 > URL关键词拦截 > 单URL CC防御 > 禁止境外 > 禁止国内 > 非浏览器拦截 > User-Agent > CC防御 > Cookie > URI过滤 > URL参数 > Thinkphp防御 > POST > 网站自定义防御"],Tt="将会清除所有配置,恢复到默认配置,包括URL黑白名单,IP黑白名单...",Ba=["此模拟攻击为:黑客进行SQL注入获取数据库权限.不会影响业务的正常运行","如果你的IP在IP白名单中测试则无效果","如需测试其他的网站可使用【http://网站域名/?id=/etc/passwd】进行攻击","返回拦截信息则表示拦截成功,如发现未拦截,建议更新至最新版"],Va=["仅导出全局配置(CC配置,攻击次数拦截配置,IP黑白名单,UA黑白名单,URL黑白名单,敏感文字替换,URL关键词拦截),不包含站点配置","GET,POST,URL,UA,Cookie仅导出响应码和开关状态,不包含内部规则","建议使用复制或下载按钮,选中复制有可能遗漏密钥"],qa=["当前扫描器开关只是对于当前防御扫描目录/文件的设置有效","此拦截是通过访问url 产生的404链接进行防御","最低不能低于20秒20次"],Fa=["初始化阶段URL拦截","URL关键词拦截添加,例:/aa/bb/?a=hello需拦截a=hello,可添加a=hello、=hello、hello"],Ha=["敏感文字替换添加,例如:敏感文字您好 替换成你好","请不要乱随意填写,可能会导致整个站点空白","在此处添加后会应用到所有网站","如果设置和网站单独设置的冲突,将会优先使用网站设置内的"],Wa=["请不要乱随意填写,违禁词建议全部为中文","当前拦截为请求时拦截,检测客户端发送中是否包含违禁词,如果包含则拦截"],ja=["注意:如果您不了解正则表达式,请不要随意修改规则内容","您可以添加或修改规则内容,但请使用正则表达式","内置规则允许修改,但不可以直接删除,您可以设置规则状态来定义防火墙是否使用此规则"],Ga=[{label:"标准模式",value:1},{label:"增强模式",value:2}],$a=[{label:"宽松",value:1},{label:"标准",value:2},{label:"严格",value:3},{label:"超严格",value:4}],za=[{label:"浏览器验证",value:"browser"},{label:"跳转验证",value:"js"},{label:"验证码验证",value:"captcha"},{label:"人机验证",value:"renji"},{label:"滑动验证",value:"slide"}],Ya=[{label:"URL匹配",value:"url"},{label:"正则匹配",value:"regular"}],Ka=[{label:"跳转验证",value:1},{label:"验证码验证",value:2},{label:"人机验证",value:3},{label:"滑动验证",value:4}],Qa=[{label:"钉钉",value:"dingding"},{label:"飞书",value:"feishu"},{label:"企业微信",value:"weixin"}],Ja=[{label:"漏洞攻击告警",value:"attack"},{label:"CC攻击告警",value:"cc"},{label:"恶意文件上传告警",value:"upload"},{label:"禁国外告警",value:"abroad"},{label:"自定义规则告警",value:"customize"},{label:"UA黑名单告警",value:"uablack"}],Xa=["当前CC防御为单个URl设置CC防御,建议最低范围为60秒和30次"],Za=["优先级:增强模式 > URL增强模式 > 标准模式","当前模式为单URL开启人机验证,保护某URL的措施","例子:某URL为注册页面www.bt.cn/regire.html,那么添加URL为:/regire.html 验证模式任意","注意:如果网站存在CDN,建议设置为跳转验证,其他验证可能会存在被CDN缓存的问题"],es=["开启人机验证时需要不验证某些页面时使用","例子1 : /admin/admin.php?system=abc 添加地址: /admin/admin.php","例子2: /admin/1 1 为可变 1-99 添加地址为: /admin/[1-99]"],{request:n}=j(),It=async()=>await be(),Ut=async()=>{try{const t=await Ie();return n(t),t.status}catch(t){return!1}},Ot=async t=>{try{const a=await me({obj:t==="scan_conf"?"set_scan_conf":t});return n(a),a.status}catch(e){return!1}},At=async(t,e)=>{try{const a=await we({obj:t,statusCode:e});return n(a),a.status}catch(a){return!1}},Dt=async(t,e)=>{try{const a=await ee({obj:t,statusCode:e});return n(a),a.status}catch(a){return!1}},Nt=async()=>(await ve()).msg||"",ts=async t=>{try{const e=await Ce({backup_data:t});return n(e),e.status}catch(e){return!1}},Mt=async()=>{try{const t=await ke();return n(t),t.status}catch(t){return!1}},as=async()=>(await Se()).data||[];async function ss(){var a,s,l;const t=await Ue(),e=(s=(a=t.data)!=null?a:t)!=null?s:[];return Array.isArray(e)?e:e&&typeof e=="object"&&"list"in e?(l=e.list)!=null?l:[]:[]}const z=async t=>{try{const e=t==="charge"?await Pe():await xe();return n(e),e.status}catch(e){return!1}},Bt=async()=>{try{const t=await Ee();return n(t),t.status}catch(t){return!1}},Vt=async()=>{try{const t=await Le();return n(t),t.status}catch(t){return!1}},qt=async()=>{try{const t=await Re();return n(t),t.status}catch(t){return!1}},Ft=async t=>{try{const e=await Te({ruleName:t});return n(e),e.status}catch(e){return!1}},ns=async t=>{try{const e=await We(t);return n(e),e.status}catch(e){return!1}},os=async t=>{try{const e=await je(t);return n(e),e.status}catch(e){return!1}},ls=async t=>{try{const e=await Ge(t);return n(e),e.status}catch(e){return!1}},rs=async t=>{try{return await Oe(t)}catch(e){return!1}},is=async t=>{try{const e=await ee(t);return n(e),e.status}catch(e){return!1}},cs=async t=>{try{const e=await $e(t);return n(e),e.status}catch(e){return!1}},us=async t=>{try{const e=await Ae(t);return n(e),e.status}catch(e){return!1}},ds=async(t,e)=>{try{const a=await De({method_type:t,check:e});return n(a),a.status}catch(a){return!1}},hs=async(t,e)=>{try{const a=await Ne({header_type:t,header_type_len:e});return n(a),a.status}catch(a){return!1}},fs=async(t,e)=>{try{const a=await Me({header_type:t,header_type_len:e});return n(a),a.status}catch(a){return!1}},_s=async(t,e)=>{try{const a=await Be({header_type:t,header_type_len:e});return n(a),a.status}catch(a){return!1}},ps=async(t,e,a)=>{try{const s=await gt({url:t,type:e,param:a});return n(s),s.status}catch(s){return!1}},gs=async(t,e,a)=>{try{const s=await ze({url:t,type:e,param:a});return n(s),s.status}catch(s){return!1}},ys=async(t,e,a)=>{try{const s=await yt({url:t,frequency:e,cycle:a});return n(s),s.status}catch(s){return!1}},bs=async(t,e,a)=>{try{const s=await bt({url:t,frequency:e,cycle:a});return n(s),s.status}catch(s){return!1}},ms=async t=>{try{const e=await Ye({url:t});return n(e),e.status}catch(e){return!1}},ws=async(t,e,a,s)=>{try{const l=await mt({uri:t,param:e,type:a,stype:s});return n(l),l.status}catch(l){return!1}},vs=async t=>{try{const e=await Ke({uri:t});return n(e),e.status}catch(e){return!1}},Cs=async(t,e)=>{try{const a=await Qe({text:t,text2:e});return n(a),a.status}catch(a){return!1}},ks=async t=>{try{const e=await Je({body:JSON.stringify(t)});return n(e),e.status}catch(e){return!1}},Ss=async t=>{try{const e=await Xe({text:t});return n(e),e.status}catch(e){return!1}},Ps=async t=>{try{const e=await Ze({text:t});return n(e),e.status}catch(e){return!1}},xs=async()=>(await et()).data.value||[],Es=async t=>{try{const e=await tt({url_find:t});return n(e),e.status}catch(e){return!1}},Ls=async t=>{try{const e=await at({url_find:t});return n(e),e.status}catch(e){return!1}},Rs=async t=>{try{const e=await st({pdata:t,json:1});return n(e),e.status}catch(e){return!1}},Ts=async()=>{try{const t=await nt({type:"uri_find"});return n(t),t.status}catch(t){return!1}},Is=async t=>{try{const e=await ot({text:t});return n(e),e.status}catch(e){return!1}},Us=async t=>{try{const e=await lt({text:t});return n(e),e.status}catch(e){return!1}},Os=async(t,e)=>{try{const a=await Ve({spider:t,ip:e});return n(a),a.status}catch(a){return!1}},As=(t,e)=>qe({ip:t,spider:e}),Ds=async(t,e)=>{try{const a=await Fe({spider:t,ip_list:e});return n(a),a.status}catch(a){return!1}},Ns=async t=>{try{const e=await rt({text:t});return n(e),e.status}catch(e){return!1}},Ms=async t=>{try{const e=await it({text:t});return n(e),e.status}catch(e){return!1}},Bs=async()=>(await He()).data.value||[],Vs=async()=>(await ct()).data||{},qs=async(t,e,a)=>{try{const s=await ut(t,{url:e,title:a,atall:"True"});return n(s),s.status}catch(s){return!1}},Fs=async()=>(await dt()).data||[],Hs=async()=>(await ht()).data.value||[],Ws=async t=>{try{const e=await ft({url_find:t});return n(e),e.status}catch(e){return!1}},js=async t=>{try{const e=await _t({url_find:t});return n(e),e.status}catch(e){return!1}},Gs=async t=>{const e=await te({ruleName:t});return(e==null?void 0:e.data)||[]},$s=async(t,e,a)=>{try{const s=await pt({ruleValue:t,ps:e,ruleName:a});return n(s),s.status}catch(s){return!1}},zs=async(t,e,a,s)=>{try{const l=await Ct({index:t,ruleBody:e,rulePs:a,ruleName:s});return n(l),l.status}catch(l){return!1}},Ys=async(t,e)=>{try{const a=await wt({index:t,ruleName:e});return n(a),a.status}catch(a){return!1}},Ks=async(t,e)=>{try{const a=await vt({index:t,ruleName:e});return n(a),a.status}catch(a){return!1}},Qs=async()=>(await te({ruleName:"scan_black"})).data||{},V=kt,G=W({}),Ht=(t,e)=>{e&&(G[t]=e)};let S=null;const Wt=t=>{S=t},B=async()=>{F.value=!0;try{const t=await It(),e=t==null?void 0:t.data;Object.assign(M,e),D.value=e.open,Gt()}catch(t){}finally{F.value=!1}},jt=(t,e)=>{if(t.key==="cc_tolerate"){const a=x("cc");return(a==null?void 0:a.status)||200}return e==null?void 0:e.status},Gt=()=>{I.value=Lt.map(t=>{const e=x(t.fieldPath||t.key);return{...t,open:(e==null?void 0:e.open)||(de(e)?!1:!!e),status:jt(t,e)||200}})},x=t=>{const e=t.split(".");let a=M;for(const s of e)if(a&&typeof a=="object"&&s in a)a=a[s];else return null;return t==="file_upload"&&a&&typeof a=="object"&&(a.from_data=M.from_data),a},H=t=>{let e=I.value;if(t!=="all"&&(e=e.filter(a=>a.category===t)),E.value){const a=E.value.toLowerCase();e=e.filter(s=>s.name.toLowerCase().includes(a)||s.ps.toLowerCase().includes(a))}return e},$t=Q(()=>E.value?V.some(t=>H(t.key).length>0):!0),zt=t=>{if(T.value=t,t==="all"){S&&S.scrollTo({top:0,behavior:"smooth"});return}const e=G[t];if(e&&S){const a=S.getBoundingClientRect(),s=e.getBoundingClientRect(),l=S.scrollTop+s.top-a.top-10;S.scrollTo({top:l,behavior:"smooth"})}},Yt=t=>{if(E.value){T.value="all";return}const e=t.target,{scrollTop:a,scrollHeight:s,clientHeight:l}=e,f=e.getBoundingClientRect();if(a<50){T.value="all";return}if(a+l>=s-50){T.value="sensitive_words";return}const _=[];V.forEach(o=>{const y=G[o.key];if(y){const C=y.getBoundingClientRect();if(C.top<f.bottom&&C.bottom>f.top){const O=Math.abs(C.top-f.top);_.push({key:o.key,distance:O})}}}),_.length>0&&(_.sort((o,y)=>o.distance-y.distance),T.value=_[0].key)},Kt=async t=>{await Ut()&&(D.value=t)},Qt=(t,e)=>{const a=t.split("."),s=a.slice(0,-1).reduce((f,_)=>{var o;return(o=f==null?void 0:f[_])!=null?o:f},M),l=a.at(-1);s&&typeof s=="object"&&l&&(s[l]&&typeof s[l]=="object"?s[l].open=e:s[l]=e)},Jt=async(t,e)=>{if(await X({title:"关闭".concat(t.name),content:"关闭后,此功能在所有网站中会停止防护,是否继续操作?"}),await Ot(t.key)){const s=I.value.findIndex(l=>l.key===t.key);s>-1&&(I.value[s].open=e),Qt(t.fieldPath||t.key,e?1:0)}},Xt=async(t,e)=>{let a=t.key;if(t.key==="cc_tolerate"&&(a="cc"),t.key==="scan_conf")return await Dt("set_scan_conf",e)&&Y(t,e),!1;await At(a,e)&&Y(t,e)};function Y(t,e){const a=I.value.findIndex(s=>s.key===t.key);a>-1&&(I.value[a].status=e)}const Zt=async(t,e)=>{switch(e.action){case"dialog":e.dialogPath&&aa(t,e.dialogPath);break;case"sync":e.syncApi&&await sa(t,e.syncApi);break;case"export":e.syncApi==="download_charge_malicious_ip"&&await Bt()&&window.open("/download?filename=/www/server/panel/data/charge_malicious_ip.txt","_blank");break;case"file-editor":{if(e.filePath){const{open:a}=ye();let s=e.filePath;if(!s.endsWith(".html")){const l=x(t.fieldPath||t.key);s=(l==null?void 0:l.reqfile)||s}a("/www/server/btwaf/html/".concat(s))}break}}},ea={"./dialogs/cc-defense-rule/index.vue":()=>u(()=>import("./index452.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),"./dialogs/attack-retry-rule/index.vue":()=>u(()=>import("./index453.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),"./dialogs/attack-alert/index.vue":()=>u(()=>import("./index454.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),"./dialogs/single-url-cc/index.vue":()=>u(()=>import("./index455.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),"./dialogs/url-enhance-mode/index.vue":()=>u(()=>import("./index456.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),"./dialogs/human-verify-whitelist/index.vue":()=>u(()=>import("./index457.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),"./dialogs/http-request-filter/index.vue":()=>u(()=>import("./index458.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),"./dialogs/url-request-type/index.vue":()=>u(()=>import("./index459.js?v=1777008528").then(t=>t.i),__vite__mapDeps([]),import.meta.url),"./dialogs/api-defense/index.vue":()=>u(()=>import("./index460.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),"./dialogs/spider-pool/index.vue":()=>u(()=>import("./index461.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),"./dialogs/file-upload-config/index.vue":()=>u(()=>import("./index462.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),"./dialogs/rule-table/index.vue":()=>u(()=>import("./index463.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),"./dialogs/scan-rule/index.vue":()=>u(()=>import("./index464.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),"./dialogs/dir-scan-defense/index.vue":()=>u(()=>import("./index465.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),"./dialogs/sensitive-text/index.vue":()=>u(()=>import("./index466.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),"./dialogs/url-keyword-block/index.vue":()=>u(()=>import("./index467.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),"./dialogs/banned-words/index.vue":()=>u(()=>import("./index468.js?v=1777008528"),__vite__mapDeps([]),import.meta.url)},ta=["cc-defense-rule","single-url-cc","url-enhance-mode","human-verify-whitelist","url-request-type","api-defense","spider-pool","file-upload-config","rule-table","sensitive-text","url-keyword-block","banned-words","http-request-filter"],aa=(t,e)=>{const a=ea[e];if(!a){j().warn("该配置项暂无详细设置");return}const s={configKey:t.key,configData:K(t),refresh:B,getSourceData:()=>K(t)},l=t.dialogTitle||"设置".concat(t.name),f=t.dialogBtn||["保存","取消"];ta.some(o=>e.includes(o))?N({title:l,area:t.dialogWidth||"600px",component:a,compData:s,showFooter:!1}):N({title:l,area:t.dialogWidth||"600px",component:a,compData:s,btn:f,onConfirm:()=>(B(),!0)})},K=t=>t.key==="http_request_filter"?{method_type:x("method_type"),header_len:x("header_len"),http_config:x("http_config")}:x(t.fieldPath||t.key),sa=async(t,e)=>{let a=!1;if(e==="get_charge_malicious_ip")a=await z("charge");else if(e==="get_update_malicious_ip")a=await z("update");else if(e==="get_zhizu_list")a=await Vt();else if(e==="sync_cnlist")a=await qt();else if(e!=null&&e.startsWith("get_rule:")){const s=e.split(":")[1];a=await Ft(s)}a||j().error("同步失败")},na=()=>{N({title:"模拟攻击",area:"700px",component:()=>u(()=>import("./index469.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),showFooter:!1})},oa=async()=>{const t=await Nt();t&&N({title:"导出防火墙全局配置",area:"600px",component:()=>u(()=>import("./index470.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),compData:{configData:t},showFooter:!1})},la=()=>{N({title:"导入防火墙全局配置",area:"600px",component:()=>u(()=>import("./index471.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),compData:{refresh:B},btn:["导入","取消"]})},ra=async()=>{await X({title:"是否恢复站点默认配置",content:Tt,type:"calc"})&&await Mt()&&B()},ia=[{code:200,label:"200 正常访问",value:200},{code:404,label:"404 文件不存在",value:404},{code:403,label:"403 拒绝访问",value:403},{code:444,label:"444 关闭/重置连接",value:444},{code:500,label:"500 应用程序错误",value:500},{code:502,label:"502 连接连接超时",value:502},{code:503,label:"503 服务器不可用",value:503}],ca={class:"px-[2.6rem] py-[1.6rem] rounded-lg border min-h-[14rem] border-[var(--el-border-color)] flex flex-col justify-between"},ua={class:"flex flex-col"},da={class:"flex justify-between"},ha={class:"flex items-center gap-2"},fa={class:"font-semibold"},_a=["innerHTML"],pa={key:0,class:"btlink text-[1.2rem] mt-2"},ga={key:0,class:"flex justify-end items-end mt-2"},ya=J({__name:"config-card",props:{config:{}},emits:["toggle","status-code-change","button-click"],setup(t,{emit:e}){const a=t,s=e,l=o=>{s("toggle",a.config,o)},f=o=>{s("status-code-change",a.config,o)},_=o=>{s("button-click",a.config,o)};return(o,y)=>{const C=ae,w=se,O=ne,q=Z;return c(),d("div",ca,[i("div",ua,[i("div",da,[i("div",ha,[i("span",fa,v(t.config.name),1)]),t.config.hasSwitch?(c(),A(C,{key:0,"model-value":t.config.open,onChange:y[0]||(y[0]=p=>l(p))},null,8,["model-value"])):L("",!0)]),i("p",{class:"mt-2 leading-normal text-[1.2rem] text-[var(--el-text-color-secondary)] line-clamp-2",innerHTML:t.config.ps},null,8,_a),t.config.key==="drop_abroad"?(c(),d("p",pa,v(r(M).drop_abroad_count)+"个网站已开启此功能",1)):L("",!0)]),t.config.hasStatusCode||t.config.buttons.length?(c(),d("div",ga,[t.config.hasStatusCode?(c(),A(O,{key:0,"model-value":t.config.status,class:"w-[140px] mr-4",onChange:f},{default:g(()=>[(c(!0),d(P,null,R(r(ia),p=>(c(),A(w,{key:p.value,label:"响应状态[".concat(p.code,"]"),value:p.value},{default:g(()=>[m(v(p.label),1)]),_:2},1032,["label","value"]))),128))]),_:1},8,["model-value"])):L("",!0),(c(!0),d(P,null,R(t.config.buttons,p=>(c(),A(q,{key:p.label,type:"primary",plain:"",onClick:h=>_(p)},{default:g(()=>[m(v(p.label),1)]),_:2},1032,["onClick"]))),128))])):L("",!0)])}}}),ba={class:"waf-box-shadow py-[2rem] px-[2.6rem] mt-[1.2rem]"},ma={class:"shrink-0 border-b border-[var(--el-border-color-light)]"},wa={class:"flex items-end justify-between"},va={class:"flex h-[48px] mb-[-1px] font-medium"},Ca=["onClick"],ka={class:"mb-[6px] w-[280px]"},Sa={class:"shrink-0 mt-8 rounded px-6 py-10 flex justify-between items-center border border-[var(--el-border-color-light)]"},Pa={class:"flex items-center"},xa={class:"flex items-center text-[14px] mr-6"},Ea={key:0,class:"text-[var(--el-color-primary)] flex items-center"},La={key:1,class:"text-[var(--el-color-danger)] flex items-center"},Ra={class:"flex space-x-3"},Ta={key:0,class:"p-[2rem] waf-box-shadow"},Ia={class:"text-[1.6rem] font-bold mb-6 text-[var(--el-text-color-primary)]"},Ua=J({__name:"page",setup(t){const{mainHeight:e}=he(),a=U(null),s=Q(()=>[{key:"all",label:"全部"},...V]),l=_=>{Yt(_)},f=()=>{Kt(!D.value)};return oe(()=>{B(),a.value&&Wt(a.value)}),(_,o)=>{const y=fe,C=_e,w=Z,O=ce,q=pe,p=ue;return le((c(),d("div",{class:"flex flex-col",style:ie({height:"".concat(r(e)-80,"px")})},[i("div",ba,[i("div",ma,[i("div",wa,[i("div",va,[(c(!0),d(P,null,R(s.value,h=>(c(),d("div",{key:h.key,class:$(["px-8 flex items-center justify-center cursor-pointer border-t border-r first:border-l first:rounded-tl last:rounded-tr select-none border-[var(--el-border-color-light)]",r(T)===h.key?"text-primary  border-b-transparent relative z-10":"text-[var(--el-text-color-regular)] border-b hover:text-[var(--el-color-primary)]"]),onClick:k=>r(zt)(h.key)},v(h.label),11,Ca))),128))]),i("div",ka,[b(C,{modelValue:r(E),"onUpdate:modelValue":o[0]||(o[0]=h=>re(E)?E.value=h:null),placeholder:"搜索设置"},{suffix:g(()=>[b(y,{icon:"search",class:"cursor-pointer"})]),_:1},8,["modelValue"])])])]),i("div",Sa,[i("div",Pa,[o[4]||(o[4]=i("span",{class:"text-[var(--el-text-color-primary)] font-medium text-[15px] mr-8"},"防火墙开关",-1)),i("div",xa,[o[3]||(o[3]=i("span",{class:"text-[var(--el-text-color-regular)] mr-2"},"当前状态:",-1)),r(D)?(c(),d("span",Ea,[...o[1]||(o[1]=[m("开启",-1),i("span",{class:"svgtofont-icon-start text-primary mt-1 ml-1"},null,-1)])])):(c(),d("span",La,[...o[2]||(o[2]=[m("关闭",-1),i("span",{class:"svgtofont-icon-stop text-danger mt-1 ml-1"},null,-1)])]))]),b(w,{type:"primary",onClick:f},{default:g(()=>[m(v(r(D)?"停止":"开启"),1)]),_:1}),o[5]||(o[5]=i("span",{class:"text-[var(--el-text-color-secondary)] text-[13px] ml-4"}," *此开关关闭后所有防护将失效 ",-1))]),i("div",Ra,[b(w,{onClick:r(na)},{default:g(()=>[...o[6]||(o[6]=[m("模拟攻击",-1)])]),_:1},8,["onClick"]),b(w,{onClick:r(oa)},{default:g(()=>[...o[7]||(o[7]=[m("导出配置",-1)])]),_:1},8,["onClick"]),b(w,{onClick:r(la)},{default:g(()=>[...o[8]||(o[8]=[m("导入配置",-1)])]),_:1},8,["onClick"]),b(w,{onClick:r(ra)},{default:g(()=>[...o[9]||(o[9]=[m("恢复默认配置",-1)])]),_:1},8,["onClick"])])])]),i("div",{ref_key:"scrollContainerEl",ref:a,class:"flex-1 overflow-auto my-4",onScroll:l},[r($t)?L("",!0):(c(),d("div",Ta,[b(O,{description:"未搜索到相关设置"})])),(c(!0),d(P,null,R(r(V),h=>(c(),d(P,{key:h.key},[r(H)(h.key).length>0?(c(),d("div",{key:0,ref_for:!0,ref:k=>r(Ht)(h.key,k),class:"mb-6 p-[2rem] waf-box-shadow"},[i("h3",Ia,v(h.label),1),i("div",{class:$(["grid gap-4",h.key==="website_vulne_defense"?"grid-cols-2":"grid-cols-4"])},[(c(!0),d(P,null,R(r(H)(h.key),k=>(c(),A(ya,{key:k.key,config:k,onToggle:r(Jt),onStatusCodeChange:r(Xt),onButtonClick:r(Zt)},null,8,["config","onToggle","onStatusCodeChange","onButtonClick"]))),128))],2)],512)):L("",!0)],64))),128))],544),b(q,{class:"waf-box-shadow py-[2rem] px-[2.6rem] !m-0 !mt-[1.2rem]"},{default:g(()=>[(c(!0),d(P,null,R(r(Rt),(h,k)=>(c(),d("li",{key:k,class:"mb-1"},v(h),1))),128))]),_:1})],4)),[[p,r(F)]])}}}),Oa=ge(Ua,[["__scopeId","data-v-f86ac7c8"]]),Js=Object.freeze(Object.defineProperty({__proto__:null,default:Oa},Symbol.toStringTag,{value:"Module"}));export{Ss as $,Ja as A,Ot as B,Ga as C,Gs as D,ja as E,$s as F,Ks as G,es as H,Ys as I,Qs as J,cs as K,qa as L,is as M,Ha as N,Cs as O,ks as P,Fa as Q,$a as R,Qa as S,xs as T,Ya as U,za as V,Es as W,Ls as X,Rs as Y,Ts as Z,Wa as _,os as a,Ps as a0,Is as a1,Us as a2,as as a3,Ba as a4,Va as a5,ts as a6,qs as a7,Xa as a8,ys as a9,bs as aa,ws as ab,ps as ac,zs as ad,Js as ae,Vs as b,ls as c,Ka as d,vs as e,ss as f,Za as g,Bs as h,Ns as i,Ms as j,ds as k,hs as l,_s as m,us as n,Fs as o,gs as p,Hs as q,ms as r,ns as s,rs as t,fs as u,Ws as v,js as w,Os as x,As as y,Ds as z};
function __vite__mapDeps(indexes) {
  if (!__vite__mapDeps.viteFileDeps) {
    __vite__mapDeps.viteFileDeps = []
  }
  return indexes.map((i) => __vite__mapDeps.viteFileDeps[i])
}