高级 Web 漏洞扫描器 - 模块化设计与实现文档

高级 Web 漏洞扫描器 - 模块化设计与实现文档

一、文档概述

本文档对基于 Python 开发的高级 Web 漏洞扫描器进行全维度模块化解析,涵盖架构设计、核心模块功能、使用方式及扩展指南。该扫描器具备 SQL 注入、XSS、敏感文件泄露、目录遍历、HTTP 方法配置不当等多维度漏洞检测能力,采用模块化设计保证可扩展性,内置反反检测机制提升扫描稳定性,支持多格式报告输出满足不同场景需求。

二、整体架构设计

2.1 架构分层

该扫描器遵循模块化、高内聚、低耦合设计原则,整体分为四层结构:

层级核心模块功能定位
配置层ScanConfig类、VulnerabilityResult数据类统一管理扫描规则、请求参数、漏洞结果结构
基础能力层会话初始化、安全请求、漏洞结果记录提供扫描基础支撑能力,封装通用操作
漏洞检测层SQL 注入、XSS、敏感文件、目录遍历、HTTP 方法检测实现各类漏洞的核心检测逻辑
应用层报告生成、全量扫描入口、授权校验对外提供扫描入口,输出检测结果

2.2 核心设计理念

  1. 配置解耦:所有扫描规则、请求参数集中管理,新增漏洞类型无需修改核心逻辑
  2. 异常容错:全链路异常捕获 + 自动重试机制,保证扫描稳定性
  3. 反反检测:随机 User-Agent、请求延迟随机化,降低被目标系统识别的概率
  4. 合规性:强制授权校验,明确法律风险提示,符合网络安全合规要求
  5. 可扩展:每个漏洞检测模块独立封装,新增检测能力仅需实现对应方法

三、核心模块详细解析

3.1 配置模块(Config Module)

3.1.1 VulnerabilityResult 数据类

模块定位:标准化漏洞检测结果结构,统一数据存储格式

@dataclass
class VulnerabilityResult:
    """漏洞检测结果数据结构"""
    vuln_type: str  # 漏洞类型(SQLi/XSS/FileLeak等)
    risk_level: str  # 风险等级(High/Medium/Low/Info)
    url: str  # 检测URL
    payload: str  # 触发payload
    evidence: str  # 漏洞证据(响应特征)
    response_code: int  # 响应状态码
    detection_time: str  # 检测时间

核心特性

  • 基于dataclass实现,自动生成初始化、打印等方法,简化代码
  • 字段语义清晰,覆盖漏洞报告所需核心信息
  • 支持通过asdict()方法快速转换为字典,便于报告序列化
3.1.2 ScanConfig 配置类

模块定位:集中管理所有扫描相关配置,实现规则与业务逻辑解耦

class ScanConfig:
    """扫描配置类"""
    # 请求相关配置
    REQUEST_TIMEOUT = 10  # 默认超时时间(秒)
    RETRY_TIMES = 2  # 重试次数
    REQUEST_DELAY_BASE = 0.5  # 基础请求延迟(秒)
    REQUEST_DELAY_RANGE = 1.0  # 延迟随机范围(秒)
    ENABLE_SSL_VERIFY = False  # SSL验证开关

    # User-Agent池(反反检测)
    USER_AGENTS = [
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...",
        # 更多UA...
    ]

    # 各漏洞检测规则配置
    SQLI_PAYLOADS = [...]  # SQL注入测试载荷
    SQLI_ERROR_KEYWORDS = [...]  # SQL报错关键词
    XSS_PAYLOADS = [...]  # XSS测试载荷
    SENSITIVE_FILES = {...}  # 敏感文件列表及验证规则
    PATH_TRAVERSAL_PAYLOADS = [...]  # 目录遍历载荷
    TEST_METHODS = [...]  # HTTP方法测试列表

核心特性

  • 配置分类清晰,按功能模块划分配置项
  • 支持动态调整:可通过继承重写配置,适配不同扫描场景
  • 规则可扩展:新增 payload / 关键词仅需修改配置,无需改动检测逻辑

3.2 基础能力模块(Basic Capability Module)

3.2.1 授权校验模块 _validate_authorization

模块定位:合规性校验,强制提醒用户获得合法授权,规避法律风险

def _validate_authorization(self):
    """合法性授权校验提示"""
    warning_msg = """
    ==============================================
    ⚠️  重要警告:
    1. 本工具仅用于合法授权的安全测试场景
    2. 未经授权扫描他人网站可能违反《网络安全法》
    3. 使用前请确保已获得目标系统所有者的书面授权
    ==============================================
    """
    print(warning_msg)
    confirm = input("确认已获得合法授权并承担所有法律责任?(y/N): ")
    if confirm.lower() != "y":
        print("❌ 未确认授权,程序退出")
        exit(1)

核心价值

  • 明确法律风险,符合网络安全合规要求
  • 强制交互确认,避免非授权使用
3.2.2 会话初始化模块 _init_session

模块定位:初始化请求会话,配置基础请求参数,实现反反检测基础能力

def _init_session(self, headers: Optional[Dict]) -> requests.Session:
    """初始化请求会话"""
    session = requests.Session()

    # 基础配置
    session.verify = self.config.ENABLE_SSL_VERIFY
    session.timeout = self.config.REQUEST_TIMEOUT

    # 请求头配置(含随机UA)
    default_headers = {
        "User-Agent": random.choice(self.config.USER_AGENTS),
        "Accept": "text/html,application/xhtml+xml...",
        # 更多请求头...
    }

    # 合并自定义请求头
    if headers:
        default_headers.update(headers)
    session.headers.update(default_headers)

    return session

核心特性

  • 会话复用:使用requests.Session减少 TCP 连接建立开销
  • 反反检测:随机选择 User-Agent,模拟真实浏览器请求
  • 灵活扩展:支持自定义请求头,适配特殊场景
3.2.3 安全请求模块 _safe_request

模块定位:封装通用请求逻辑,实现异常处理、自动重试、请求延迟等能力

def _safe_request(self, method: str, url: str, **kwargs) -> Optional[requests.Response]:
    """
    安全请求方法(带重试、延迟、异常处理)
    :param method: 请求方法(GET/POST等)
    :param url: 请求URL
    :return: 响应对象或None
    """
    # 随机请求延迟(反反检测)
    delay = self.config.REQUEST_DELAY_BASE + random.uniform(0, self.config.REQUEST_DELAY_RANGE)
    time.sleep(delay)

    # 重试逻辑
    for attempt in range(self.config.RETRY_TIMES + 1):
        try:
            # 随机更换User-Agent
            self.session.headers["User-Agent"] = random.choice(self.config.USER_AGENTS)
            response = self.session.request(method, url, **kwargs)
            return response
        except requests.exceptions.Timeout:
            # 超时异常处理
        except requests.exceptions.ConnectionError:
            # 连接异常处理
        except Exception as e:
            # 通用异常处理

核心特性

  • 分级异常处理:区分超时、连接错误、通用异常,精准定位问题
  • 自动重试:失败请求自动重试,提升扫描成功率
  • 反反检测:请求延迟随机化 + 每次请求更换 UA,降低被识别概率
  • 超时控制:统一超时配置,避免请求阻塞
3.2.4 漏洞结果记录模块 _add_vulnerability

模块定位:标准化漏洞结果记录逻辑,统一日志输出格式

def _add_vulnerability(self, vuln_type: str, risk_level: str, url: str,
                       payload: str, evidence: str, response_code: int):
    """添加漏洞结果"""
    result = VulnerabilityResult(
        vuln_type=vuln_type,
        risk_level=risk_level,
        url=url,
        payload=payload,
        evidence=evidence,
        response_code=response_code,
        detection_time=datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    )
    self.results.append(result)
    # 标准化日志输出
    print(f"[!] 发现{risk_level}风险 {vuln_type}:{url}")
    print(f"    Payload:{payload}")
    print(f"    证据:{evidence[:100]}..." if len(evidence) > 100 else f"    证据:{evidence}")

核心价值

  • 统一结果存储:所有漏洞结果按标准结构存储,便于后续报告生成
  • 标准化输出:日志格式统一,提升可读性
  • 证据截断:长证据自动截断,避免日志冗余

3.3 漏洞检测模块(Vulnerability Detection Module)

3.3.1 SQL 注入检测模块 scan_sql_injection

模块定位:检测目标 URL 的 SQL 注入漏洞,支持报错注入、时间盲注等多种检测方式

def scan_sql_injection(self, test_urls: List[str]) -> List[VulnerabilityResult]:
    """
    增强版SQL注入检测
    :param test_urls: 待测试的URL路径(包含参数占位)
    :return: SQL注入漏洞结果列表
    """
    print("\n=== 开始SQL注入漏洞探测 ===")
    sql_results = []

    for url_path in tqdm(test_urls, desc="SQL注入检测进度"):
        for payload, desc in self.config.SQLI_PAYLOADS:
            test_url = urljoin(self.target_url, url_path + quote(payload))

            # 基础请求
            start_time = time.time()
            response = self._safe_request("GET", test_url)
            elapsed_time = time.time() - start_time

            if not response:
                continue

            # 1. 报错注入检测
            error_evidence = ""
            for keyword in self.config.SQLI_ERROR_KEYWORDS:
                if keyword in response.text:
                    error_evidence = f"响应中包含数据库错误关键词:{keyword}"
                    break

            if error_evidence:
                self._add_vulnerability(...)  # 记录报错注入漏洞
                break

            # 2. 时间盲注检测
            if "SLEEP" in payload and elapsed_time >= 3:
                time_evidence = f"请求耗时{elapsed_time:.2f}秒,符合时间盲注特征"
                self._add_vulnerability(...)  # 记录时间盲注漏洞
                break

    return sql_results

核心检测逻辑

  1. 报错注入:检测响应中是否包含数据库报错关键词
  2. 时间盲注:检测包含 SLEEP 的 payload 请求耗时是否符合预期
  3. 进度展示:使用 tqdm 展示检测进度,提升用户体验
  4. 提前终止:同一 URL 检测到漏洞后跳过其他 payload,提升效率
3.3.2 XSS 检测模块 scan_xss

模块定位:检测 XSS 漏洞及 XSS 防护配置缺失问题,支持多类型 XSS payload 检测

def scan_xss(self, test_urls: List[str]) -> List[VulnerabilityResult]:
    """
    增强版XSS检测
    :param test_urls: 待测试的URL路径(包含参数占位)
    :return: XSS漏洞结果列表
    """
    print("\n=== 开始XSS漏洞探测 ===")
    xss_results = []

    # 先检测响应头安全配置
    base_response = self._safe_request("GET", self.target_url)
    if base_response:
        missing_headers = [h for h in self.config.XSS_SAFE_HEADERS if h not in base_response.headers]
        if missing_headers:
            self._add_vulnerability(...)  # 记录XSS防护缺失

    # 检测XSS注入点
    for url_path in tqdm(test_urls, desc="XSS检测进度"):
        for payload, desc in self.config.XSS_PAYLOADS:
            test_url = urljoin(self.target_url, url_path + payload)
            response = self._safe_request("GET", test_url)

            if not response:
                continue

            # 解码响应内容以便检测
            response_text = response.text
            decoded_payload = payload.replace("%3C", "<").replace("%3E", ">").replace("%22", "\"")

            # 检测payload是否被原样返回(未转义)
            if payload in response_text or decoded_payload in response_text:
                # 排除被转义的情况(如&lt;script&gt;)
                escaped_payload = payload.replace("<", "&lt;").replace(">", "&gt;")
                if escaped_payload not in response_text:
                    self._add_vulnerability(...)  # 记录XSS漏洞
                    break

    return xss_results

核心检测逻辑

  1. 防护配置检测:检测响应头是否包含 X-XSS-Protection、CSP 等安全头
  2. Payload 检测:多类型 XSS payload 测试,覆盖脚本标签、事件触发、编码绕过等场景
  3. 转义判断:区分 payload 是否被 HTML 转义,降低误报率
  4. 解码处理:自动解码 URL 编码的 payload,提升检测准确性
3.3.3 敏感文件泄露检测模块 scan_sensitive_files

模块定位:检测目标站点是否存在敏感文件泄露,支持内容特征验证降低误报

def scan_sensitive_files(self) -> List[VulnerabilityResult]:
    """
    增强版敏感文件泄露检测(增加内容验证)
    :return: 敏感文件泄露结果列表
    """
    print("\n=== 开始敏感文件泄露探测 ===")
    file_results = []

    for file_path, config in tqdm(self.config.SENSITIVE_FILES.items(), desc="敏感文件检测进度"):
        test_url = urljoin(self.target_url, file_path)
        response = self._safe_request("GET", test_url)

        if not response:
            continue

        # 状态码200且不是404页面
        if response.status_code == 200 and "404 Not Found" not in response.text:
            # 内容特征验证
            content_match = True
            if config["keywords"]:
                content_match = any(kw in response.text for kw in config["keywords"])

            if content_match:
                self._add_vulnerability(...)  # 记录敏感文件泄露
                file_results.append([test_url, config["risk"], evidence])

    return file_results

核心检测逻辑

  1. 基础检测:状态码 200 且非 404 页面
  2. 内容验证:基于关键词验证文件内容,避免误报(如.git/config 需包含 [core] 关键词)
  3. 风险分级:按文件敏感程度划分风险等级(Critical/High/Medium/Info)
3.3.4 目录遍历检测模块 scan_path_traversal

模块定位:检测目标 URL 是否存在目录遍历漏洞,支持多类型遍历 payload

def scan_path_traversal(self, test_urls: List[str]) -> List[VulnerabilityResult]:
    """
    新增:目录遍历漏洞检测
    :param test_urls: 待测试的URL路径
    :return: 目录遍历漏洞结果列表
    """
    print("\n=== 开始目录遍历漏洞探测 ===")
    traversal_results = []

    for url_path in tqdm(test_urls, desc="目录遍历检测进度"):
        for payload, desc in self.config.PATH_TRAVERSAL_PAYLOADS:
            test_url = urljoin(self.target_url, url_path + quote(payload))
            response = self._safe_request("GET", test_url)

            if not response:
                continue

            # 检测敏感内容特征
            traversal_keywords = [":x:", "/bin/bash", "root:", "admin:"]
            matched_keywords = [kw for kw in traversal_keywords if kw in response.text]

            if matched_keywords:
                self._add_vulnerability(...)  # 记录目录遍历漏洞
                traversal_results.append([test_url, payload, evidence])
                break

    return traversal_results

核心检测逻辑

  1. 多 payload 测试:覆盖相对路径、Windows 路径、URL 编码路径等遍历方式
  2. 内容验证:检测响应中是否包含 /etc/passwd 等敏感文件特征内容
  3. 高危标记:目录遍历漏洞标记为 Critical 风险等级
3.3.5 HTTP 方法检测模块 scan_http_methods

模块定位:检测目标服务器是否开启危险 HTTP 方法,如 PUT/DELETE/TRACE 等

def scan_http_methods(self) -> List[VulnerabilityResult]:
    """
    新增:HTTP方法漏洞检测
    :return: HTTP方法漏洞结果列表
    """
    print("\n=== 开始HTTP方法检测 ===")
    method_results = []

    for method in tqdm(self.config.TEST_METHODS, desc="HTTP方法检测进度"):
        response = self._safe_request(method, self.target_url)

        if not response:
            continue

        # 检测危险方法是否开启
        if method in ["PUT", "DELETE", "TRACE"] and response.status_code not in [403, 405]:
            evidence = f"服务器允许{method}方法,状态码:{response.status_code}"
            risk_level = "High" if method in ["PUT", "TRACE"] else "Medium"
            self._add_vulnerability(...)  # 记录HTTP方法配置不当
            method_results.append([self.target_url, method, evidence])

    return method_results

核心检测逻辑

  1. 方法遍历:测试 GET/POST/PUT/DELETE/OPTIONS/TRACE 等常用方法
  2. 危险判断:PUT/TRACE 方法开启标记为 High 风险,DELETE 为 Medium 风险
  3. 状态码验证:通过 403/405 状态码判断方法是否被禁止

3.4 报告生成模块(Report Module)

模块定位:支持多格式报告输出,包含控制台、JSON、HTML 三种格式,提供漏洞统计与详情展示

def generate_report(self, output_format: str = "console", output_path: str = None) -> None:
    """
    生成检测报告
    :param output_format: 输出格式(console/json/html)
    :param output_path: 输出路径(文件格式时必填)
    """
    if not output_path and output_format != "console":
        raise ValueError("文件输出格式必须指定output_path")

    # 汇总统计
    risk_stats = {"Critical": 0, "High": 0, "Medium": 0, "Low": 0, "Info": 0}
    vuln_types = {}

    for result in self.results:
        risk_stats[result.risk_level] += 1
        vuln_types[result.vuln_type] = vuln_types.get(result.vuln_type, 0) + 1

    # 基础报告信息
    report = {
        "scan_info": {
            "target_url": self.target_url,
            "start_time": self.scan_start_time,
            "end_time": self.scan_end_time,
            "duration": f"{(datetime.strptime(self.scan_end_time, '%Y-%m-%d %H:%M:%S') - datetime.strptime(self.scan_start_time, '%Y-%m-%d %H:%M:%S')).total_seconds():.2f}秒"
        },
        "risk_statistics": risk_stats,
        "vuln_type_statistics": vuln_types,
        "vulnerabilities": [asdict(r) for r in self.results]
    }

    # 控制台输出
    if output_format == "console":
        # 控制台格式化输出逻辑
    # JSON输出
    elif output_format == "json":
        # JSON文件生成逻辑
    # HTML输出
    elif output_format == "html":
        # HTML报告生成逻辑(含样式美化)

核心特性

  1. 多格式支持
    • 控制台:实时展示,适合快速查看
    • JSON:结构化数据,适合自动化分析
    • HTML:可视化展示,适合人工审核(含样式美化、风险等级颜色标记)
  2. 统计分析:提供风险等级统计、漏洞类型统计,直观展示扫描结果
  3. 信息完整:包含扫描时间、目标 URL、耗时、漏洞详情等全量信息
  4. 易用性:HTML 报告支持 URL 跳转、内容截断,提升阅读体验

3.5 全量扫描入口模块(Full Scan Module)

模块定位:提供统一的扫描入口,整合所有检测模块,自动生成报告

def full_scan(self, test_urls: List[str]) -> None:
    """
    全量扫描入口
    :param test_urls: 待测试的URL路径列表
    """
    self.scan_start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    print(f"\n=== 开始全量安全扫描 ===")
    print(f"目标URL:{self.target_url}")
    print(f"开始时间:{self.scan_start_time}")

    # 执行各项检测
    self.scan_sql_injection(test_urls)
    self.scan_xss(test_urls)
    self.scan_sensitive_files()
    self.scan_path_traversal(test_urls)
    self.scan_http_methods()

    self.scan_end_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    # 生成报告
    self.generate_report(output_format="console")
    # 自动保存JSON和HTML报告
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    self.generate_report(output_format="json", output_path=f"scan_report_{timestamp}.json")
    self.generate_report(output_format="html", output_path=f"scan_report_{timestamp}.html")

核心价值

  1. 统一入口:一键执行所有检测模块,简化使用流程
  2. 自动报告:扫描完成后自动生成控制台报告,并保存 JSON/HTML 文件
  3. 时间记录:记录扫描开始 / 结束时间,计算总耗时
  4. 扩展性:新增检测模块后,仅需在此处添加调用即可集成

四、使用指南

4.1 环境准备

# 安装依赖
pip install requests tqdm

4.2 基础使用

# 1. 导入模块
from advanced_web_scanner import AdvancedWebScanner

# 2. 配置目标信息(必须获得合法授权)
TARGET_URL = "https://example.com"  # 授权测试目标
TEST_URLS = [
    "search.php?q=",
    "article.php?id=",
    "user.php?uid=",
    "file.php?path="
]

# 3. 初始化扫描器
scanner = AdvancedWebScanner(TARGET_URL)

# 4. 执行全量扫描
scanner.full_scan(TEST_URLS)

4.3 自定义使用

4.3.1 单独执行某类漏洞检测
# 仅检测SQL注入
scanner = AdvancedWebScanner(TARGET_URL)
sql_vulns = scanner.scan_sql_injection(TEST_URLS)

# 仅检测敏感文件
file_vulns = scanner.scan_sensitive_files()
4.3.2 自定义扫描配置

python

运行

# 继承ScanConfig重写配置
class CustomScanConfig(ScanConfig):
    REQUEST_TIMEOUT = 15  # 延长超时时间
    SQLI_PAYLOADS = [("' OR '1'='1 -- ", "自定义SQL payload")]  # 自定义payload

# 使用自定义配置初始化扫描器
custom_config = CustomScanConfig()
scanner = AdvancedWebScanner(TARGET_URL, config=custom_config)
4.3.3 生成指定格式报告
# 生成JSON报告
scanner.generate_report(output_format="json", output_path="custom_report.json")

# 生成HTML报告
scanner.generate_report(output_format="html", output_path="custom_report.html")

五、扩展指南

5.1 新增漏洞检测模块

  1. 添加配置:在ScanConfig类中添加新漏洞的检测规则(如 payload、关键词)
  2. 实现检测方法:在AdvancedWebScanner类中实现scan_xxx方法,遵循现有模块的设计规范
  3. 集成到全量扫描:在full_scan方法中调用新增的检测方法
  4. 更新报告逻辑:如需特殊报告展示,可扩展generate_report方法

示例 - 新增弱口令检测模块:

# 1. 添加配置
class ScanConfig:
    # 新增弱口令配置
    WEAK_PASSWD_PATHS = ["/admin/login.php", "/login"]
    WEAK_CREDENTIALS = [("admin", "admin"), ("admin", "123456"), ("root", "root")]

# 2. 实现检测方法
def scan_weak_password(self) -> List[VulnerabilityResult]:
    print("\n=== 开始弱口令检测 ===")
    weak_results = []
    
    for path in tqdm(self.config.WEAK_PASSWD_PATHS, desc="弱口令检测进度"):
        test_url = urljoin(self.target_url, path)
        for username, password in self.config.WEAK_CREDENTIALS:
            data = {"username": username, "password": password}
            response = self._safe_request("POST", test_url, data=data)
            
            if response and "登录成功" in response.text:
                evidence = f"弱口令成功登录:{username}/{password}"
                self._add_vulnerability(
                    vuln_type="弱口令",
                    risk_level="Critical",
                    url=test_url,
                    payload=f"{username}/{password}",
                    evidence=evidence,
                    response_code=response.status_code
                )
                weak_results.append([test_url, username, password])
                break
    
    return weak_results

# 3. 集成到full_scan
def full_scan(self, test_urls: List[str]) -> None:
    # 原有检测逻辑...
    self.scan_weak_password()  # 新增调用
    # 报告生成逻辑...

5.2 性能优化建议

  1. 并发扫描:引入asyncio+aiohttp替代同步 requests,提升扫描效率
  2. 代理池集成:添加代理 IP 轮换机制,避免 IP 被封禁
  3. 任务队列:使用 Celery 实现分布式扫描,支持大规模目标检测
  4. 缓存机制:缓存已检测 URL 的结果,避免重复扫描
  5. 增量扫描:记录历史扫描结果,仅检测新增 / 变更 URL

5.3 反反检测增强

  1. 请求头随机化:除 UA 外,随机生成 Accept、Referer 等请求头
  2. Cookie 池:使用真实浏览器 Cookie,模拟已登录状态
  3. 行为模拟:添加鼠标移动、页面滚动等浏览器行为模拟
  4. 验证码处理:集成 2Captcha 等验证码识别服务,应对验证码拦截

六、安全与合规说明

  1. 合法授权:本工具仅用于合法授权的安全测试,未经授权扫描他人网站可能违反《网络安全法》
  2. 风险控制:内置请求延迟、重试次数限制,避免对目标服务器造成拒绝服务攻击
  3. 数据处理:扫描结果仅保存在本地,不收集 / 上传任何目标数据
  4. 免责声明:使用者需自行承担使用本工具带来的法律责任,开发者不承担任何连带责任

七、总结

该高级 Web 漏洞扫描器通过模块化设计实现了多维度漏洞检测能力,具备高扩展性、高稳定性、高合规性的特点。核心优势包括:

  • 模块化架构:各功能模块独立封装,便于扩展与维护
  • 精准检测:多维度验证机制降低误报率,提升检测准确性
  • 用户友好:多格式报告、进度展示、标准化日志,提升使用体验
  • 安全合规:强制授权校验、风险控制机制,符合网络安全规范

适用于安全测试人员、开发人员进行 Web 应用安全检测,可根据实际需求灵活扩展检测能力,是 Web 安全防护的重要工具。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值