Kali Linux无线安全评估实战:从WPA2握手原理到密码破解防御
1. 项目概述从“破解”到“安全评估”的认知转变看到“Kali Linux破解WiFi教程”这个标题很多朋友的第一反应可能是想“蹭个网”。但作为一名在网络安全领域摸爬滚打多年的从业者我必须在一开始就明确一个核心观点我们今天讨论的绝非教你如何非法侵入他人网络。恰恰相反这是一次关于无线网络安全防御的深度实践。Kali Linux作为全球最知名的渗透测试和网络安全审计发行版其内置的无线工具链是安全研究员、网络管理员和合规性测试人员用于评估自身无线网络防御强度的“手术刀”。理解攻击者的手段是构建坚固防御的前提。本教程旨在提供一个完整的、在合法授权环境下例如对你自家或你拥有明确书面测试授权的网络进行无线安全评估的实操框架。我们将从原理入手拆解WPA/WPA2-PSK个人最常见的安全协议的握手过程并演示如何使用Kali Linux中的工具完成从监听、捕获握手包到离线密码分析的全过程。这不仅是一次工具教学更是一次对无线安全机制的深度剖析。2. 环境准备与核心工具解析工欲善其事必先利其器。一次成功的无线安全评估始于稳定且强大的硬件与软件环境。2.1 硬件选择无线网卡是关键并非所有无线网卡都能胜任这项工作。核心要求是网卡芯片必须支持监听模式和数据包注入。监听模式允许网卡捕获所有经过其信道的无线数据包而不仅仅是发送给它的包数据包注入则是主动发送特定格式数据包的基础用于后续的“解除认证攻击”。主流选择方案Alfa AWUS036ACH双频2.4GHz/5GHz网卡采用Realtek RTL8812AU芯片。性能强劲社区支持好是许多专业人士的首选。其高增益天线能显著提升信号接收范围。Panda PAU09性价比之选同样基于RTL8812AU芯片性能稳定适合入门。内置Intel无线网卡部分较新的Intel无线网卡如AX200/AX210通过更新的驱动也能支持监听模式但兼容性和功能完整性可能不如专用外置网卡且通常不支持数据包注入功能受限。注意购买时务必确认芯片型号并提前搜索“芯片型号 monitor mode kali”以确认社区支持情况。驱动问题往往是新手的第一道坎。2.2 软件环境Kali Linux的部署Kali Linux提供了所有必要的工具。你可以选择多种安装方式物理机安装获得最佳性能但需要专用设备。虚拟机安装如VMware Workstation或VirtualBox方便快捷但需要解决USB网卡直通问题。在虚拟机设置中需将USB控制器设置为3.0及以上并将网卡设备直接连接到虚拟机。便携式Live USB将Kali制作成可启动U盘在任何电脑上启动不改变主机系统。我个人推荐在物理机或配置了USB直通的虚拟机中运行以确保无线功能的完整性和稳定性。安装完成后第一件事是更新系统sudo apt update sudo apt full-upgrade -y。2.3 核心工具链简介Kali中用于无线评估的工具众多我们将聚焦于最经典、最有效的组合aircrack-ng套件核心工具集包含airmon-ng管理监听模式、airodump-ng扫描与捕获、aireplay-ng数据包注入和aircrack-ng密码破解。hashcat世界上最快的密码恢复工具支持GPU加速用于高效的离线密码破解。当aircrack-ng速度不够时它是终极武器。wifite一个自动化脚本封装了上述工具的常用流程适合快速批量测试但不利于理解原理。本教程将主要使用aircrack-ng套件进行手动操作因为理解每一步背后的原理远比点击一个“开始破解”按钮更重要。3. 无线安全原理与握手包捕获实战在动手之前我们必须理解目标WPA/WPA2-PSK的四次握手包。这是整个评估过程的“圣杯”。3.1 WPA2-PSK握手过程解析WPA2-PSK采用基于预共享密钥的四次握手协议来验证客户端并生成加密密钥。其核心过程简述如下接入点AP发送ANonceAP生成一个随机数ANonce发送给客户端。客户端发送SNonce客户端生成自己的随机数SNonce并结合预共享密钥Wi-Fi密码、AP的MAC地址、客户端的MAC地址等信息计算出一个“成对临时密钥PTK”。然后将SNonce和一段消息完整性校验码MIC发送给AP。AP发送GTK和MICAP收到SNonce后用同样的方式计算出PTK验证客户端发来的MIC。验证通过后它将组临时密钥GTK用于加密广播流量和另一个MIC发送给客户端。客户端确认客户端验证AP发来的MIC确认后发送一个简单的确认信息。关键点在第二次握手时客户端发送的数据帧中包含了一个用PTK计算的MIC。而PTK是由预共享密钥密码和两个随机数、两个MAC地址等参数通过一个确定的算法PBKDF2生成的。如果我们捕获了包含ANonce和SNonce的完整四次握手数据包我们就拥有了除密码外的所有计算PTK的要素。接下来我们就可以通过不断猜测密码用同样的算法计算PTK和MIC并与捕获到的MIC进行比对。如果匹配则猜中了密码。3.2 实战步骤开启监听与扫描网络首先连接你的外置无线网卡并打开终端。步骤一检查网卡与终止干扰进程sudo airmon-ng这个命令会列出所有无线网卡接口通常类似wlan0或wlx00c0caXXXXXX。记下你的网卡接口名。sudo airmon-ng check kill这个命令会终止可能干扰无线网卡工作的网络管理器等进程如NetworkManager, wpa_supplicant。执行后你的有线网络可能会暂时断开这是正常的。步骤二开启监听模式sudo airmon-ng start wlan0将wlan0替换为你的实际接口名。成功后会创建一个新的监听模式接口通常名为wlan0mon。步骤三扫描周边无线网络sudo airodump-ng wlan0mon此时终端会开始实时刷新显示周围所有的Wi-Fi网络。关键信息列包括BSSID 接入点的MAC地址是目标的唯一标识。PWR 信号强度数值越接近0如-30信号越好数值越小如-90信号越差。选择信号强的目标成功率更高。#Data 捕获到的数据包数量对于后续操作很重要。CH 信道。ENC 加密方式。我们的目标是显示为WPA2或WPA的。ESSID 无线网络名称SSID。让扫描运行一会儿找到你的目标网络记下它的BSSID和信道CH。然后按CtrlC停止扫描。3.3 捕获目标握手包这是最需要耐心的一步。我们需要针对特定目标网络进行抓包并等待或触发一个合法客户端连接到该网络从而捕获四次握手。步骤四针对目标网络抓包sudo airodump-ng -c 6 --bssid 11:22:33:44:55:66 -w capture wlan0mon请替换参数-c 6 目标网络的信道CH。--bssid 11:22:33:44:55:66 目标网络的BSSIDMAC地址。-w capture 抓取的数据包将保存为以capture为前缀的文件如capture-01.cap。wlan0mon 你的监听模式接口。执行后终端会进入一个新的监控界面上半部分显示目标AP的信息下半部分显示连接到该AP的客户端STATION及其MAC地址。步骤五主动触发握手解除认证攻击如果当前没有活跃客户端或者你想加速过程可以主动让一个已连接的客户端断开并重连从而产生新的握手包。这需要用到aireplay-ng。首先在新的终端窗口对目标AP和某个客户端从airodump-ng下半部分获取其MAC发起解除认证攻击sudo aireplay-ng -0 10 -a 11:22:33:44:55:66 -c AA:BB:CC:DD:EE:FF wlan0mon参数说明-0 10 发起解除认证攻击发送10个攻击包通常足够。-a 11:22:33:44:55:66 目标AP的BSSID。-c AA:BB:CC:DD:EE:FF 目标客户端的MAC地址。如果不知道具体客户端可以省略此参数攻击所有客户端但可能造成短暂网络干扰。执行后观察运行airodump-ng的终端窗口。在右上角如果出现“WPA handshake: 11:22:33:44:55:66”的提示恭喜你握手包已成功捕获实操心得有时攻击不成功可能是因为客户端支持“802.11w管理帧保护”。遇到这种情况只能耐心等待自然的重连事件比如设备从睡眠中唤醒。这也是评估网络防御强度的一个指标——启用了管理帧保护的网络更难被这种方式干扰。4. 离线密码分析与字典破解成功捕获握手包.cap文件后接下来的工作就可以在离线状态下进行了。核心是使用密码字典进行暴力猜测。4.1 密码字典的选用与制作字典的质量直接决定了成功率。一个弱密码在强大的字典面前不堪一击。常用字典来源Kali内置字典/usr/share/wordlists/目录下有很多如rockyou.txt.gz需解压fasttrack.txt。线上项目Seclists项目GitHub包含了海量的字典从常见密码到特定泄露密码集合。自定义生成 使用crunch、hashcat的--stdout模式或rsmangler等工具根据目标信息如公司名、生日、电话号码生成定制化字典。字典选择策略第一轮快速尝试。使用rockyou.txt这类常见密码字典体积适中覆盖了大量用户的习惯性弱密码。第二轮组合攻击。如果目标密码可能基于已知信息如“公司名年份”使用规则引擎进行组合。hashcat的规则文件在/usr/share/hashcat/rules/下非常强大可以对字典中的每个单词进行大小写变换、添加后缀前缀等操作。第三轮暴力破解。在毫无头绪时这是最后的手段。你需要指定字符集如小写字母、数字、常见符号和密码长度范围。随着长度增加所需时间呈指数级增长。4.2 使用aircrack-ng进行字典破解这是最直接的方法。假设你的捕获文件是capture-01.cap字典是rockyou.txt。sudo aircrack-ng -w /usr/share/wordlists/rockyou.txt capture-01.capaircrack-ng会自动识别.cap文件中的握手包。如果文件中有多个握手包或网络它会让你选择目标。之后它便开始逐行读取字典计算每个候选密码的PMK成对主密钥和PTK并与捕获的MIC进行比对。关键参数-w 指定字典路径。-b 如果.cap文件中有多个BSSID可以用-b BSSID指定目标。--showkeys 在破解成功后显示密钥。这个过程完全依赖CPU单核性能对于复杂密码速度较慢。如果字典跑完未成功你会看到“KEY NOT FOUND”的提示。4.3 使用hashcat进行高性能破解GPU加速hashcat是离线密码恢复的王者尤其当你有性能强大的NVIDIA或AMD显卡时。它支持将WPA握手包转换为hashcat可识别的格式hashcat -m 22000并利用GPU的并行计算能力进行高速破解。步骤一转换握手包格式首先我们需要从.cap文件中提取出握手信息转换为hashcat专用的.hccapx或.22000格式。aircrack-ng套件中的aircrack-ng本身可以将.cap输出为.hccapx但更推荐使用hcxpcapngtool通常已安装hcxpcapngtool -o target_hash.22000 capture-01.cap这会生成一个target_hash.22000文件其中包含了破解所需的所有哈希信息。步骤二使用hashcat进行破解hashcat -m 22000 target_hash.22000 /usr/share/wordlists/rockyou.txt-m 22000 指定哈希模式为WPA/WPA2。如果使用NVIDIA显卡可以添加-D 2强制使用CUDAAMD显卡用-D 1。步骤三进阶攻击模式hashcat的强大之处在于其攻击模式字典攻击如上所示。组合攻击将两个字典中的词组合。掩码攻击智能暴力破解当你对密码格式有猜测时非常高效。例如你怀疑密码是8位数字hashcat -m 22000 target_hash.22000 -a 3 ?d?d?d?d?d?d?d?d?d代表数字?l代表小写字母?u代表大写字母?s代表特殊符号。规则攻击对字典应用复杂的变换规则。hashcat -m 22000 target_hash.22000 /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule破解成功后hashcat会在屏幕上显示破解出的密码并保存在hashcat.potfile中。注意事项GPU破解会产生大量热量并消耗大量电力。务必确保你的散热系统良好并且是在合法的负载测试环境下进行。长时间高负载运行可能对硬件造成损耗。5. 高级技巧、防御措施与法律边界掌握了基本流程后我们探讨一些提升效率的技巧更重要的是从防御者角度思考如何应对这些评估手段。5.1 提升成功率的技巧与策略目标选择优先评估使用弱加密如WEP现已极其罕见或信号强度高PWR -60的WPA2网络。信号越好捕获的数据包质量越高。PMKID攻击2018年披露的一种新攻击方式无需等待客户端握手可直接从AP发送的某些单播帧中提取哈希值PMKID。使用hcxdumptool和hcxtools套件可以尝试捕获PMKID。对于支持此功能的AP这简化了捕获步骤。利用“Wi-Fi菠萝”等工具这些是专业的无线安全审计硬件可以自动化地创建邪恶双子AP诱使用户连接从而直接获取密码或进行中间人攻击。这属于更高级的主动评估范畴。社会工程学结合最强的安全漏洞往往是人。结合目标信息公司名、产品、纪念日生成的定制字典其威力远大于通用字典。5.2 如何防御此类评估加固你的Wi-Fi网络作为网络管理员或个人用户了解攻击手段后可以采取以下措施显著提升无线网络安全性使用强密码这是最根本的。密码长度至少12位混合大小写字母、数字和符号避免使用字典单词、常见短语或个人相关信息。可以考虑使用密码管理器生成并存储随机密码。启用WPA3如果你的路由器和所有客户端设备支持请务必启用WPA3-SAE同时认证相等协议。它通过“Dragonfly”握手协议能够有效防御离线字典攻击和握手包重放攻击。即使捕获了握手包攻击者也无法进行离线密码猜测。禁用WPSWi-Fi Protected Setup功能存在设计缺陷其PIN码可以在数小时内被暴力破解从而绕过密码。请务必在路由器设置中关闭WPS。隐藏SSID网络名称这并不能提供真正的安全通过监听模式依然可以发现但能减少被普通扫描工具发现的机会属于“安全通过隐匿”的初级手段。启用MAC地址过滤只允许已知设备的MAC地址接入。但MAC地址可以被监听和伪造因此这只是一层额外的障碍而非可靠的安全措施。降低发射功率在满足覆盖的前提下适当降低路由器的发射功率缩小信号覆盖范围让攻击者更难在远处接收到强信号。网络隔离启用“客户端隔离”功能防止连接到同一无线网络的设备之间相互访问这可以限制攻击者在接入网络后的横向移动。定期更换密码特别是在怀疑有安全风险时。5.3 法律与道德红线你必须知道的这是整个教程中最重要的部分。技术的使用必须被约束在法律和道德的框架内。仅限授权测试你只能在你自己拥有所有权的网络设备上或者已经获得网络所有者明确书面授权的情况下进行所有测试活动。未经授权扫描、监听或攻击他人的无线网络在绝大多数国家和地区都是明确的违法行为可能构成“计算机欺诈”、“未经授权访问网络”等罪名面临民事赔偿甚至刑事处罚。目的正当性安全测试的目的必须是改善安全状况而非窃取信息、破坏服务或获取不当利益。范围限定测试的范围、时间和方法应在授权书中明确规定并避免对网络服务的可用性造成不必要的影响例如持续的解除认证攻击可能导致服务中断。保密义务在测试过程中发现的任何关于目标网络的信息包括但不限于密码、配置、漏洞细节都必须严格保密仅向授权方报告不得泄露或用于任何其他目的。个人体会我职业生涯早期参与的第一个正式渗透测试项目就是无线网络评估。那份沉甸甸的授权书和法律协议让我第一次深刻体会到我们手中的工具不是玩具而是带有巨大责任的双刃剑。真正的黑客精神是探索与创造是理解系统如何工作并使之更安全而不是破坏与侵占。通过合法合规的途径将这份知识用于保护你的家庭、你的公司乃至更广泛社区的网络空间安全才是这项技能最大的价值所在。从理解一次握手包的捕获到你为自己家路由器设置第一个WPA3强密码这正是一个安全从业者旅程的缩影。

相关新闻

Android相机黑屏问题排查与优化实践

Android相机黑屏问题排查与优化实践

1. 问题现象与初步排查58同城App作为国内头部生活服务平台,其相机功能在二手房拍摄、求职简历上传等核心场景中扮演重要角色。近期我们收到用户反馈,部分Android设备在调用App内相机时出现黑屏现象,具体表现为:点击拍照按钮后相机…

2026/10/10 11:55:48 阅读更多 →
Python实现Antoine方程蒸汽压计算与可视化:从原理到工程实践

Python实现Antoine方程蒸汽压计算与可视化:从原理到工程实践

1. 项目概述:从数据到洞察,用Python解锁Antoine方程在化工、热力学乃至环境科学领域,物质的蒸汽压是一个基础且关键的物性参数。它决定了液体何时沸腾、混合物如何分离,甚至是大气中污染物的挥发性。对于工程师和科研人员来说&…

2026/10/13 0:34:36 阅读更多 →
Simulink仿真单相全桥逆变电路:从SPWM原理到工程调试全解析

Simulink仿真单相全桥逆变电路:从SPWM原理到工程调试全解析

1. 项目概述:从理论到实践的逆变电路仿真如果你正在学习电力电子,或者工作中需要设计一个将直流电转换成交流电的装置,那么“单相电压型逆变电路”绝对是你绕不开的核心课题。这不仅是教科书里的经典案例,更是光伏逆变器、不间断电…

2026/10/15 19:36:51 阅读更多 →

最新新闻

asc-devkit 算子原型注册:使用 OpAICPUDef::KernelSo 配置 AICPU 算子动态库名称

asc-devkit 算子原型注册:使用 OpAICPUDef::KernelSo 配置 AICPU 算子动态库名称

人工智能深度学习算子库CANNAscend 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址&…

2026/10/16 1:35:40 阅读更多 →
Firefox Decrypt 使用教程

Firefox Decrypt 使用教程

Firefox Decrypt 使用教程 【免费下载链接】firefox_decrypt Firefox Decrypt is a tool to extract passwords from Mozilla (Firefox™, Waterfox™, Thunderbird, SeaMonkey) profiles 项目地址: https://gitcode.com/gh_mirrors/fi/firefox_decrypt 1. 项目的目录结…

2026/10/16 1:35:40 阅读更多 →
ESP-IDF 快速安装指南:EIM 一键装好开发环境,3 步烧录首个固件

ESP-IDF 快速安装指南:EIM 一键装好开发环境,3 步烧录首个固件

ESP-IDF 快速安装指南:EIM 一键装好开发环境,3 步烧录首个固件 【免费下载链接】esp-idf Espressif IoT Development Framework. Official development framework for Espressif SoCs. 项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf …

2026/10/16 1:35:40 阅读更多 →
LAMMPS fix polarize 系列命令详解:DIELECTRIC 包中界面感应电荷的三种求解方法

LAMMPS fix polarize 系列命令详解:DIELECTRIC 包中界面感应电荷的三种求解方法

科研科学计算高性能计算 【免费下载链接】lammps Public development project of the LAMMPS MD software package 项目地址: https://gitcode.com/gh_mirrors/la/lammps 点击查看 免费下载 在含电解质界面的介电系统中(如疏水壁、胶体、脂质双分子层&…

2026/10/16 1:35:40 阅读更多 →
Mac Mouse Fix:三步让普通鼠标好过触控板

Mac Mouse Fix:三步让普通鼠标好过触控板

Mac Mouse Fix:三步让普通鼠标好过触控板 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix Mac Mouse Fix 把平滑滚动、触控板双指手势…

2026/10/16 1:35:40 阅读更多 →
基于planetary.js与Three.js的动态地球可视化实战

基于planetary.js与Three.js的动态地球可视化实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 1:34:40 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →