攻防演练目标资产名称纠正
字数 1128 2025-10-01 14:05:44
攻防演练目标资产名称自动纠错工具教学文档
一、背景与需求
在攻防演练过程中,经常遇到目标单位名称不准确的情况,例如:
- 使用简称而非全称(如"浙江中医六院"代替完整名称)
- 单位已更名但备案信息未更新
- 各种命名不规范问题
手动纠正在攻防演练前期阶段效率低下,影响资产搜集速度,需要自动化解决方案。
二、技术方案选择
2.1 可用平台对比
- 爱企查/天眼查:参数校验严格,难以实现自动化抓取
- Riskbird:参数校验相对宽松,适合自动化实现
2.2 最终选择
选择 https://riskbird.com/ 作为数据源,通过模拟API请求实现批量查询。
三、核心代码实现
3.1 基础请求函数
import requests
import json
def req_riskbird(company_name, token):
"""
向Riskbird发送查询请求获取公司信息
参数:
company_name: 要查询的公司名称
token: 用户认证token
返回:
公司名称列表或空列表
"""
url = "https://riskbird.com/riskbird-api/newSearch"
headers = {
"Host": "riskbird.com",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
"Accept": "application/json",
"App-Device": "WEB",
"Content-Type": "application/json",
"Origin": "https://riskbird.com",
"Referer": "https://riskbird.com/search/company",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cookie": f"token={token}; app-device=WEB;"
}
payload = {
"queryType": "1",
"searchKey": company_name,
"pageNo": 1,
"range": 10,
"selectConditionData": "{\"status\":\"\",\"sort_field\":\"\"}"
}
try:
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
data = response.json()
if data.get("code") == 20000 and data.get("success"):
company_names = []
for company in data.get("data", {}).get("list", []):
if "entName" in company:
company_names.append(company["entName"])
return company_names
else:
print(f"Error: {data.get('msg', 'Unknown error')}")
return []
except requests.exceptions.RequestException as e:
print(f"Request failed: {e}")
return []
except json.JSONDecodeError:
print("Failed to parse response as JSON")
return []
3.2 公司名称匹配选择函数
def compare_company(company_name, num, token):
"""
根据用户选择模式返回匹配的公司名称
参数:
company_name: 原始公司名称
num: 选择模式(1-自动选择最高匹配, 2-手动选择)
token: 用户认证token
返回:
选择后的公司名称列表
"""
company_names = req_riskbird(company_name, token)
if not company_names:
print("未找到相关公司:", company_name)
return []
if num == 1:
return [company_names[0]]
elif num == 2:
print("以下是搜索到的所有公司名称:")
for i, name in enumerate(company_names, 1):
print(f"{i}. {name}")
try:
print("搜索单位:", company_name)
selected = int(input("请输入选择的公司编号:"))
if 1 <= selected <= len(company_names):
return [company_names[selected - 1]]
else:
print("无效的选择")
return []
except ValueError:
print("无效的输入")
return []
else:
print("无效的 num 参数")
return []
3.3 文件读取函数
def read_file():
"""
读取同目录下的tar.txt文件,将每行内容存入列表
返回:
包含所有公司名称的列表
异常:
FileNotFoundError: 文件不存在
IOError: 文件读取失败
"""
company_list = []
try:
with open('tar.txt', 'r', encoding='utf-8') as file:
for line in file:
company_name = line.strip()
if company_name:
company_list.append(company_name)
return company_list
except FileNotFoundError:
raise FileNotFoundError("错误:tar.txt 文件不存在")
except IOError:
raise IOError("错误:无法读取 tar.txt 文件")
except Exception as e:
raise Exception(f"读取文件时发生错误: {str(e)}")
四、使用流程
4.1 准备工作
- 获取Riskbird账号并登录,从浏览器开发者工具获取token
- 创建tar.txt文件,每行写入一个需要纠正的公司名称
4.2 执行流程
- 调用read_file()读取目标公司列表
- 遍历列表,对每个公司名称调用compare_company()函数
- 根据需求选择自动模式(1)或手动模式(2)
- 获取纠正后的准确公司名称
4.3 实际应用示例
输入:"浙江省中山医院"
输出:"浙江中医药大学附属第三医院(浙江省中山医院)"
五、关键技术要点
5.1 请求头设置
- 必须设置正确的User-Agent模拟浏览器行为
- Cookie中需要包含有效的token认证信息
- Content-Type必须设置为application/json
5.2 错误处理
- 网络请求异常处理
- JSON解析异常处理
- API返回错误码处理
- 文件操作异常处理
5.3 数据提取
- 从返回的JSON数据中提取entName字段
- 处理分页数据(当前代码设置为10条/页)
六、优化建议
6.1 功能扩展
- 添加批量处理模式,支持大量公司名称一次性处理
- 增加结果导出功能,支持导出为Excel或CSV格式
- 添加相似度匹配算法,提高自动选择的准确性
6.2 稳定性提升
- 添加请求重试机制
- 实现token自动刷新功能
- 添加速率限制,避免请求过于频繁被封禁
6.3 用户体验
- 添加进度显示功能
- 实现交互式命令行界面
- 添加日志记录功能
七、注意事项
- 遵守Riskbird平台的使用条款,避免过度频繁请求
- 注意token的保密性,不要泄露在代码中
- 该工具仅限合法授权的攻防演练使用
- 平台API可能有变更,需要定期维护更新
八、总结
本工具通过自动化查询Riskbird平台,有效解决了攻防演练中目标资产名称不准确的问题,显著提高了资产搜集阶段的效率。工具采用模块化设计,便于扩展和维护,可根据实际需求选择自动或手动匹配模式。