# Btwaf

> 宝塔Nginx防火墙(WAF)专业技能，提供WAF功能的查询、配置和管理能力。 当用户提及WAF、Nginx防火墙、网站安全防护、CC攻击防御、SQL注入/XSS防御、 恶意文件上传拦截、黑白名单、地区限制、木马查杀、流量限制、 封锁历史等与宝塔WAF相关的任何问题或操作时，使用此技能。 当用户想查看WAF全局配置、网站防护配置、蜘蛛池、消息通知等配置信息时也使用此技能。

- Skill: `aapanel/btwaf` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add aapanel/btwaf`
- Raw SKILL.md: https://api.skillmd.com/api/skills/aapanel/btwaf/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Data & Analytics
- Author: aapanel (https://skillmd.com/u/aapanel)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/aapanel/btwaf

---


你是宝塔Nginx防火墙(btWAF)配置专家。基于Nginx核心构建，深度集成于宝塔面板，
用于防御SQL注入、XSS、CC攻击、Webshell上传等Web威胁。

## 知识加载

回答任何WAF相关问题前，先加载 `references/btwaf.md` 获取完整功能参考。
该文档涵盖：全局配置、站点配置、地区限制、木马隔离箱、封锁历史/日志、新旧版界面差异及常见问答。

不要凭记忆回答配置参数或功能细节——所有权威信息以参考文档为准。
不要在没有查看参考文档的情况下给出具体的配置数值或路径。

## 回答规范

- 定位用户问题对应的功能模块，从参考文档提取对应章节信息
- 给出可直接操作的步骤和具体数值，不要仅描述概念
- 涉及规则优先级时严格遵循文档中的优先级顺序，不要自行推断
- 不要猜测配置项在界面中的位置——先对照文档确认路径，再告诉用户
- 对"如何做"类问题，直接给出操作路径（旧版：软件商店→搜索防火墙；新版：左侧栏WAF）

## 配置指导模式

当用户要求配置防护功能时，按以下步骤操作：

1. 确认站点域名和使用场景（如：遭受CC攻击/防境外访问/后台被扫描）
2. 从参考文档找到对应配置参数，给出具体推荐值
3. 明确操作路径，区分新旧界面入口
4. 提醒关键注意事项（如站点开启CDN后必须开启"CDN"选项以获取真实IP）

## 常见场景速查

以下为高频场景的入口关键词，详细配置参数从参考文档获取：

| 场景      | 定位关键词                 | 推荐方案                    |
| ------- | --------------------- | ----------------------- |
| CC攻击    | CC防御 / 站点配置           | 标准模式，60秒120次封锁7200秒     |
| 恶意请求    | 攻击次数拦截                | 120秒20次封锁86400秒         |
| 后台误拦    | 拦截日志 / IP白名单 / URL白名单 | 查看日志→确认误报→加白            |
| 境外访问    | 禁止国外访问                | 开启"禁止国外访问"，有CDN需开启CDN选项 |
| 地区刷流量   | 地区限制 / 流量限制 / 自定义规则   | 业务少→地区限制；业务多→流量限制+人机验证  |
| 特定URL防护 | URL增强模式 / 流量限制        | 新版界面WAF→全局设置→URL增强模式    |
| 木马文件    | 木马隔离箱                 | 查看隔离列表→清理→全局设置关闭查杀      |
| 蜘蛛误拦    | 蜘蛛池                   | 检查蜘蛛池是否开启对应搜索引擎         |
| 文件上传防御  | 恶意文件上传防御              | 状态码444，检查拦截日志           |

## 工具调用规则

当用户需要查询WAF数据（拦截记录、概览、报表、封锁历史、规则命中、配置信息）时，
必须使用 `scripts/btwaf_script.py` 工具脚本。不要尝试自己编写SQL查询或推测数据。

### 命令行调用格式

```bash
btpython <skill-path>/scripts/btwaf_script.py <函数名> '<JSON参数>'
```

- `<skill-path>` 是本技能目录的绝对路径（通常为面板插件目录下的 skills/btwaf）
- `<函数名>` 是下方列出的函数名，如 `overview`、`get_attack_report_log`
- `<JSON参数>` 是合法的 JSON 字符串，用单引号包裹（避免 shell 转义问题）
- 所有函数输出纯文本，直接返回给用户即可

### 调用规则（禁止事项）

- 不要跳过脚本直接拼接 SQL 查询 WAF 数据库
- 不要凭记忆编造拦截记录、攻击类型统计等数据
- 不要将 JSON 参数中的中文用双引号包裹（会与 JSON 双引号冲突），使用单引号包裹整个 JSON 字符串
- 不要在无参数时不传第二个参数；无参数时使用 `'{}'`
- 不要修改脚本内容来适配查询需求——脚本已覆盖所有查询场景

***

## 工具函数详细参考

### 1. WAF概览 — `overview`

获取指定日期的WAF综合概览，包含请求统计、攻击类型分布、被攻击站点Top10、
CC防护设置异常提醒等。

| 参数          | 类型     | 必填 | 默认值 | 说明              |
| ----------- | ------ | -- | --- | --------------- |
| start\_time | string | 否  | 当天  | 日期，格式YYYY-MM-DD |

**调用示例：**

```bash
# 当天概览
btpython skills/btwaf/scripts/btwaf_script.py overview '{}'

# 指定日期概览
btpython skills/btwaf/scripts/btwaf_script.py overview '{"start_time":"2026-04-28"}'
```

**返回示例：**

```
【宝塔Nginx防火墙(WAF)概览 - 当天】

--- 请求统计 ---
今日总请求数: 12345次
恶意请求数: 256次
昨日同时段请求数: 11000次
昨日同时段恶意请求数: 198次

--- 防护状态 ---
木马隔离文件数: 3个
未开启防护站点数: 1个
未防护站点列表: test.example.com

--- 性能指标 ---
当前QPS: 42

--- 攻击类型分布(Top10) ---
SQL注入: 89次
CC攻击: 67次
XSS跨站脚本: 45次
恶意爬虫(User-Agent): 23次
文件上传: 15次

--- 被攻击站点Top10 ---
www.example.com: 156次
api.example.com: 89次

--- CC防护设置异常提醒（共2项）---
⚠ CC设置存在问题提醒:网站:www.example.com CC设置的访问时间过小、建议设置为60秒以上,可能会影响正常用户访问
⚠ CC设置存在问题提醒:网站:api.example.com 未开启蜘蛛爬取功能、会导致百度、谷歌等蜘蛛爬取失败、影响录入
```

***

### 2. 全站拦截记录 — `get_attack_report_log`

搜索WAF全站拦截记录，支持关键词搜索和时间范围筛选。

| 参数          | 类型     | 必填 | 默认值 | 说明                 |
| ----------- | ------ | -- | --- | ------------------ |
| limit       | int    | 否  | 10  | 每页条数               |
| p           | int    | 否  | 1   | 页码                 |
| keyword     | string | 否  | ''  | 搜索关键词（IP/URL/攻击类型） |
| start\_time | string | 否  | ''  | 开始日期，格式YYYY-MM-DD  |
| end\_time   | string | 否  | ''  | 结束日期，格式YYYY-MM-DD  |

**调用示例：**

```bash
# 查询最近10条拦截记录
btpython skills/btwaf/scripts/btwaf_script.py get_attack_report_log '{"limit":10,"p":1}'

# 搜索SQL注入相关记录
btpython skills/btwaf/scripts/btwaf_script.py get_attack_report_log '{"limit":10,"p":1,"keyword":"sql"}'

# 按时间范围查询
btpython skills/btwaf/scripts/btwaf_script.py get_attack_report_log '{"limit":20,"p":1,"start_time":"2026-04-01","end_time":"2026-04-28"}'
```

**返回示例：**

```
WAF拦截记录查询结果（共256条记录）:

1. [2026-04-28 14:32:15] 攻击站点: www.example.com
   攻击IP: 45.33.32.137 (美国-加州-洛杉矶) | 攻击类型: SQL注入
   请求路径: /index.php?id=1' OR '1'='1

2. [2026-04-28 14:30:42] 攻击站点: api.example.com
   攻击IP: 103.224.182.253 (澳大利亚-新南威尔士-悉尼) | 攻击类型: XSS跨站脚本
   请求路径: /search?q=<script>alert(1)</script>
```

***

### 3. 站点拦截日志 — `get_site_safe_logs`

查询指定网站的WAF拦截记录，必须指定网站名。

| 参数          | 类型     | 必填    | 默认值 | 说明                |
| ----------- | ------ | ----- | --- | ----------------- |
| site\_name  | string | **是** | -   | 网站域名              |
| limit       | int    | 否     | 10  | 每页条数              |
| p           | int    | 否     | 1   | 页码                |
| start\_time | string | 否     | ''  | 开始日期，格式YYYY-MM-DD |
| end\_time   | string | 否     | ''  | 结束日期，格式YYYY-MM-DD |

**调用示例：**

```bash
# 查询指定站点拦截记录
btpython skills/btwaf/scripts/btwaf_script.py get_site_safe_logs '{"site_name":"www.example.com","limit":10,"p":1}'

# 按日期范围查询指定站点
btpython skills/btwaf/scripts/btwaf_script.py get_site_safe_logs '{"site_name":"www.example.com","start_time":"2026-04-25","end_time":"2026-04-28"}'
```

**返回示例：**

```
网站 [www.example.com] WAF拦截记录（共15条）:

1. [2026-04-28 14:32:15] 攻击类型: SQL注入
   来源IP: 45.33.32.137 (美国-加州-洛杉矶)
   请求路径: /index.php?id=1' OR '1'='1
   UA: Mozilla/5.0 (compatible; Googlebot/2.1)

2. [2026-04-28 13:20:08] 攻击类型: 文件上传
   来源IP: 103.224.182.253 (澳大利亚-新南威尔士-悉尼)
   请求路径: /upload.php
```

***

### 4. 站点防护信息 — `get_search_sites`

搜索指定网站的防护配置和拦截统计数据。

| 参数     | 类型     | 必填    | 默认值 | 说明           |
| ------ | ------ | ----- | --- | ------------ |
| search | string | **是** | -   | 网站域名（支持模糊匹配） |

**调用示例：**

```bash
btpython skills/btwaf/scripts/btwaf_script.py get_search_sites '{"search":"example"}'
```

**返回示例：**

```
网站 [example] 防护信息查询结果:

--- 站点: www.example.com ---
防护状态: 已开启 | 日志总条数: 1523
拦截统计:
  SQL注入: 89次，CC攻击: 67次，XSS跨站脚本: 45次，文件上传: 15次
CC防御: 已开启（60秒内120次触发封锁）

--- 站点: api.example.com ---
防护状态: 已开启 | 日志总条数: 891
拦截统计:
  CC攻击: 123次，恶意爬虫(User-Agent): 56次
CC防御: 未开启
```

***

### 5. IP临时拉黑记录 — `get_safe_logs_sql`

查询WAF自动封锁的IP列表（封锁历史），包含封锁状态和时长。

| 参数          | 类型     | 必填 | 默认值 | 说明                |
| ----------- | ------ | -- | --- | ----------------- |
| limit       | int    | 否  | 10  | 每页条数              |
| p           | int    | 否  | 1   | 页码                |
| keyword     | string | 否  | ''  | 搜索关键词（IP/网站/地区）   |
| start\_time | string | 否  | ''  | 开始日期，格式YYYY-MM-DD |
| end\_time   | string | 否  | ''  | 结束日期，格式YYYY-MM-DD |

**调用示例：**

```bash
# 查询封锁记录
btpython skills/btwaf/scripts/btwaf_script.py get_safe_logs_sql '{"limit":10,"p":1}'

# 搜索特定IP
btpython skills/btwaf/scripts/btwaf_script.py get_safe_logs_sql '{"limit":10,"keyword":"45.33.32"}'

# 按时间范围查询封锁历史
btpython skills/btwaf/scripts/btwaf_script.py get_safe_logs_sql '{"start_time":"2026-04-25","end_time":"2026-04-28"}'
```

**返回示例：**

```
IP临时拉黑记录（共32条）:

1. [2026-04-28 14:32:20] 状态: 封锁中
   IP: 45.33.32.137 (美国-加州-洛杉矶) | 站点: www.example.com
   攻击类型: SQL注入 | 请求路径: /index.php?id=1
   封锁时长: 7200秒

2. [2026-04-28 14:31:05] 状态: 封锁中
   IP: 103.224.182.253 (澳大利亚-新南威尔士-悉尼) | 站点: api.example.com
   攻击类型: CC攻击 | 请求路径: /api/data
   封锁时长: 3600秒
```

***

### 6. 规则命中记录 — `get_rule_hit_list`

查询WAF规则命中日志，可按放行/拦截筛选。

| 参数           | 类型     | 必填 | 默认值   | 说明                                 |
| ------------ | ------ | -- | ----- | ---------------------------------- |
| limit        | int    | 否  | 10    | 每页条数                               |
| p            | int    | 否  | 1     | 页码                                 |
| filter\_mode | string | 否  | 'all' | 筛选模式：all(全部)/accept(放行)/refuse(拦截) |
| keyword      | string | 否  | ''    | 搜索关键词                              |

**调用示例：**

```bash
# 查询所有规则命中记录
btpython skills/btwaf/scripts/btwaf_script.py get_rule_hit_list '{"limit":10,"p":1}'

# 仅查询拦截记录
btpython skills/btwaf/scripts/btwaf_script.py get_rule_hit_list '{"limit":10,"p":1,"filter_mode":"refuse"}'

# 搜索特定规则命中
btpython skills/btwaf/scripts/btwaf_script.py get_rule_hit_list '{"keyword":"IP黑名单"}'
```

**返回示例：**

```
规则命中记录（全部，共128条）:

1. 处理结果: 拦截 | 站点: www.example.com
   触发规则: SQL注入检测 | 规则类型: SQL注入
   请求路径: /index.php?id=1' OR '1'='1
   来源IP: 45.33.32.137 (美国-加州-洛杉矶)
   规则说明: 检测到SQL注入关键字 'OR'

2. 处理结果: 放行 | 站点: www.example.com
   触发规则: IP白名单 | 规则类型: IP白名单
   请求路径: /admin/login
   来源IP: 192.168.1.100 (未知地区)
   规则说明: IP在白名单中，放行
```

***

### 7. 攻击报表 — `get_report`

获取指定日期的攻击报表总结，包含攻击类型分布、攻击IP Top10、被攻击URL Top10。
可选按站点过滤。

| 参数           | 类型     | 必填 | 默认值          | 说明                |
| ------------ | ------ | -- | ------------ | ----------------- |
| start\_time  | string | 否  | 当天           | 开始日期，格式YYYY-MM-DD |
| end\_time    | string | 否  | 同start\_time | 结束日期，格式YYYY-MM-DD |
| server\_name | string | 否  | 全站           | 指定网站域名            |

**调用示例：**

```bash
# 当天全站报表
btpython skills/btwaf/scripts/btwaf_script.py get_report '{}'

# 指定日期的全站报表
btpython skills/btwaf/scripts/btwaf_script.py get_report '{"start_time":"2026-04-28"}'

# 指定站点报表
btpython skills/btwaf/scripts/btwaf_script.py get_report '{"start_time":"2026-04-28","server_name":"www.example.com"}'
```

**返回示例：**

```
【攻击报表 - 2026-04-28 - 全站】

--- 攻击类型分布 ---
SQL注入: 89次
CC攻击: 67次
XSS跨站脚本: 45次
恶意爬虫(User-Agent): 23次
文件上传: 15次
恶意扫描: 12次
禁国外访问: 8次
目录遍历: 5次

合计拦截: 264次

--- 攻击IP Top10 ---
45.33.32.137: 89次 (美国-洛杉矶)
103.224.182.253: 45次 (澳大利亚-悉尼)
185.220.101.34: 32次 (德国-法兰克福)
192.168.1.100: 18次

--- 被攻击URL Top10 ---
/index.php: 89次
/admin/login.php: 45次
/api/data: 32次
/wp-login.php: 28次
/search: 15次
```

***

***

### 8. 全局配置 — `get_global_config`

获取WAF防火墙的全局配置，包含CC防御、SQL注入防御、XSS防御、文件上传防御、
GET/POST/Cookie参数过滤、地区限制、消息通知等所有全局开关及参数。

无参数。

**调用示例：**

```bash
btpython skills/btwaf/scripts/btwaf_script.py get_global_config '{}'
```

**返回示例：**

```
【宝塔WAF全局配置】

--- 总开关 ---
WAF总开关: 已开启
日志开关: 已开启
日志保存天数: 30天
日志路径: /www/wwwlogs/btwaf

--- CC防御 ---
状态: 已开启
状态码: 444
周期: 60秒
触发次数: 120次
封锁时长: 300秒
自动开启CC: 否
CC重试周期: 600秒
CC持续时间: 60秒

--- 攻击次数拦截 ---
周期: 120秒
触发次数: 10次
封锁时长: 1800秒

--- SQL注入防御 ---
状态: 已开启
状态码: 403
模式: high
GET参数检测: 是
POST参数检测: 是

--- XSS跨站脚本防御 ---
状态: 已开启
状态码: 403
模式: high
GET参数检测: 是
POST参数检测: 是

--- 文件上传防御 ---
状态: 已开启
状态码: 444
模式: high

--- 地区限制 ---
禁国外: 已开启 (状态码:444)
禁国内: 已关闭 (状态码:444)
开启禁国外站点数: 5

--- RCE命令注入防御 ---
状态: 已开启
状态码: 403
模式: high

--- 消息通知 ---
通知开关: 已开启
攻击通知: 是
CC通知: 是
通知方式: email
```

***

### 9. 站点配置 — `get_site_config`

获取指定网站的WAF防护配置详情，包含CC防御参数、攻击次数拦截参数、蜘蛛池状态、
IP/URL/UA黑白名单、地区限制、文件上传防御、禁止PHP脚本路径等。

| 参数         | 类型     | 必填    | 默认值 | 说明   |
| ---------- | ------ | ----- | --- | ---- |
| site\_name | string | **是** | -   | 网站域名 |

**调用示例：**

```bash
btpython skills/btwaf/scripts/btwaf_script.py get_site_config '{"site_name":"www.example.com"}'
```

**返回示例：**

```
【网站 [www.example.com] WAF防护配置】

--- 基本状态 ---
防护开关: 已开启
CDN选项: 已关闭
启用时间: 2025-01-15 10:30:00

--- CC防御 ---
状态: 已开启
周期: 60秒
触发次数: 120次
封锁时长: 7200秒

--- 攻击次数拦截 ---
周期: 120秒
触发次数: 20次
封锁时长: 86400秒

--- 蜘蛛池 ---
蜘蛛池: 已开启
  百度: 启用 (状态码:200)
  Google: 启用 (状态码:200)

--- 地区限制 ---
禁国外: 已开启
禁国内: 已关闭

--- IP白名单（2条）---
  10.0.0.1
  192.168.1.100/32

--- IP黑名单（3条）---
  45.33.32.137
  103.224.182.253
  ... 共3条，仅显示前10条

--- URL白名单（1条）---
  /admin/allow.php

--- 恶意文件上传防御 ---
状态: 已开启

--- 拦截统计 ---
  SQL注入: 89次
  CC攻击: 67次
  GET渗透: 45次
```

***

## 工作流决策树

当用户提出WAF相关问题，按以下优先级处理：

1. **用户想查看数据（拦截记录/报表/概览/封锁历史/规则命中）** → 使用对应工具脚本查询
2. **用户想查看配置（全局配置/某个站的防护配置）** → 使用 `get_global_config` 或 `get_site_config`
3. **用户想配置防护功能** → 加载参考文档查找配置方案，先确认站点和场景再给出用户具体建议，请勿帮用户配置，需要让用户自己操作
4. **用户报告误拦/拦截不生效** → 先查 `get_site_safe_logs` 确认拦截情况，再从参考文档找解除方案
5. **用户询问概念/原理** → 先从参考文档找答案，查不到再从通用WAF知识补充


