<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title><![CDATA[Cesii Blog-软件测试方法与实战进阶]]></title> 
<atom:link href="https://cesii.cn/rss.php" rel="self" type="application/rss+xml" />
<description><![CDATA[软件测试与网络安全实战：性能测试（LoadRunner / JMeter）、渗透测试（Kali / Burp Suite）及常见运维排错。]]></description>
<link>https://cesii.cn/</link>
<language>zh-cn</language>

<item>
    <title>性能测试中常说的并发、在线用户数的1:10比例从何而来？</title>
    <link>https://cesii.cn/131.html</link>
    <description><![CDATA[<p>在性能测试行业里，有一个流传甚广的“江湖规矩”：<br />
<strong>系统如果需要支撑 100 人同时在线，做 10 个并发压测就够了；如果要支撑 200 人在线，20 个并发也就齐活了。</strong></p>
<p>也就是我们常说的 <strong>1:10 的并发在线比</strong>。</p>
<p>刚入行测试的时候，这句话听过无数次，但总觉得心里发虚：这比例是拍脑袋定的吗？要是客户非得咬死“200人在线就要200并发一起上”，我们该怎么反驳？</p>
<p>直到有一天，我们把压测数据丢进 <strong>Little 定律（利特尔法则）</strong> 里一算，才发现这个比例不仅是真的，而且藏着严密的数学闭环。</p>
<hr />
<h2>一、 概念分清：谁在“在线”，谁在“并发”？</h2>
<p>在解释为什么是 1:10 之前，我们得先帮客户（甚至部分开发）理清两个极其容易混淆的概念：</p>
<ol>
<li><strong>在线用户数（Online Users）：</strong><br />
指的是“挂在系统上”的人。比如 200 个员工登录了企业 OA，或者 200 个用户打开了 App 没关闭。他们保持着登录态或心跳连接，但<strong>此时此刻并不一定在操作</strong>。</li>
<li><strong>并发用户数（Concurrent Users）：</strong><br />
指的是在<strong>同一精确时间点</strong>，实实在在地向服务器发送请求、点击提交、查询数据的人。</li>
</ol>
<p>人类不是机器，100 个在线用户在宏观的一分钟里，大家的动作是错开的：有人在看页面（思考时间），有人在填表单，有人在喝水。真正在同一毫秒向服务器发起冲击的，永远只是少数人。</p>
<p>行业历史统计和日常业务分析表明，在常规业务系统的访问高峰期，同时段处于活跃操作状态的用户数，通常占在线总人数的 <strong>5% 到 15%</strong> 之间。“1:10”（即 10%）恰好取了一个最稳健的中间值。</p>
<hr />
<h2>二、 实践出真知：用 JMeter 压测数据来验证</h2>
<p>光有经验比例还不够，我们在实际做压测时，怎么用硬核数据说服自己和客户？</p>
<p>来看一个真实的 JMeter 聚合报告（Aggregate Report）数据：</p>
<p><img src="https://cesii.cn/content/uploadfile/202609/4ef11788369609.png" alt="" /></p>
<ul>
<li><strong>吞吐量（Throughput）：</strong> 61.5 /sec（系统每秒处理 61.5 个请求）</li>
<li><strong>平均响应时间（Average）：</strong> 322 ms（即 0.322 秒）</li>
<li><strong>我们在 JMeter 中设置的并发线程数：</strong> <strong>20 线程</strong></li>
</ul>
<p>此时，排队论中最具统治力的公式登场了——<strong>Little 定律</strong>：<br />
C = λ x R<br />
<em>(并发数 = 吞吐量 × 平均响应时间)</em></p>
<p>把数据代进去：<br />
C = 61.5(吞吐量) x 0.322（平均响应时间）= 19.8{并发人数}</p>
<p><strong>结果完美吻合：</strong> 我们在 JMeter 里设置的 20 并发，通过 Little 定律反算出来的瞬时并发处理量也是 20！而按照 1:10 的比例换算，这组 20 并发稳稳承载的业务体量，正是 <strong>200 人的在线规模</strong>。</p>
<hr />
<h2>三、 为什么 Little 定律算得这么准？</h2>
<p>有些朋友可能会感叹：这公式怎么这么“神”？</p>
<p>其实，<strong>Little 定律不是经验猜想，而是一个经过严格数学证明的绝对恒等式。</strong> </p>
<p>你可以把它想象成物理学里的质量守恒，或者 S = v x t（路程 = 速度 × 时间）：</p>
<ul>
<li>λ（吞吐量）就像是<strong>流进水池的水速</strong>。</li>
<li>R（响应时间）就像是<strong>一滴水在池子里停留的平均时间</strong>。</li>
<li>C（并发数）就是<strong>任何一个瞬间，水池里正存留的水的总量</strong>。</li>
</ul>
<p>最神奇的是，Little 定律对系统的底层技术“完全盲目”——无论你的后端是 Java 还是 Go，数据库是 MySQL 还是 Redis，它都不管。只要系统在一段时间内达到了“稳态”（没有发生雪崩、死锁或严重阻塞），这个数学关系就必然成立。</p>
<hr />
<h2>四、 面对客户的“灵魂拷问”，我们该怎么说？</h2>
<p>在实际工作中，最头疼的往往不是技术本身，而是跟对性能指标有误解的客户沟通。</p>
<p>如果客户提出：“我们的业务指标是 200 人在线，为什么你们只做 20 并发？是不是想偷工减料？”</p>
<p>你可以用这套组合拳理直气壮地回应：</p>
<ol>
<li><strong>区分概念：</strong> “200 人在线不等于 200 人同时按回车。如果要求 200 个物理并发同时点，相当于系统在同一瞬间要支撑 2000 人规模的在线洪峰。”</li>
<li><strong>科学依据：</strong> “根据排队论和行业通用的 1:10 活跃比，200 人在线在高峰期的真实活跃并发就是 20 左右。”</li>
<li><strong>闭环验证：</strong> “我们通过 JMeter 压测和 Little 定律（C = λ x R）进行了实测验证，20 并发下系统吞吐量和响应时间完全平稳。这既保证了真实业务场景的真实压力，又避免了盲目堆砌硬件带来的资源浪费。”</li>
</ol>
<hr />
<p><strong>结语</strong></p>
<p>性能测试不只是简单的“点一下 Start 按钮”，更是业务逻辑与数学原理的交织。下次再遇到客户问起并发与在线的关系，不妨自信地告诉他：<strong>“20 并发，足够撑起你 200 人的业务江山了！”</strong></p>]]></description>
    <pubDate>Thu, 03 Sep 2026 01:03:43 +0800</pubDate>
    <dc:creator>cesii</dc:creator>
    <guid>https://cesii.cn/131.html</guid>
</item>
<item>
    <title>为什么有些系统要进行“系统时钟同步误差测试”？</title>
    <link>https://cesii.cn/130.html</link>
    <description><![CDATA[<p>在工业自动化和控制系统（如 SCADA）的运行维护中，总会有一项关键指标：<strong>系统时钟同步误差＜xx毫秒（ms）</strong>。</p>
<p>很多人可能会纳闷：电脑不就是用来计时的吗？为什么系统时间还要专门测试、还要花大心思去做同步？</p>
<p>其实，这背后藏着一个残酷的物理真相：<strong>计算机里的表，天生就是不准的。</strong></p>
<hr />
<h3>一、 电脑的表为什么会越走越偏？（滚雪球的误差）</h3>
<p>要搞懂时间同步，得先看看电脑是怎么计时的。</p>
<p>电脑主板上都有一个叫“石英晶振”的硬件。通电后，里面的晶体开始高频振动。电脑靠“数振动了多少次”来判定过去了几秒钟。</p>
<p>但这套硬件机制有一个无法根除的硬伤：</p>
<ol>
<li><strong>微观世界的“太阳风暴”与老化</strong>：当机箱内温度升高（热胀冷缩）、电压波动或者硬件老化时，晶体内部的物理状态就会发生微小的扰动（就像太阳表面时刻在爆发微观风暴一样）。</li>
<li><strong>每秒都在“差一点点”</strong>：因为这些物理变化，晶振的振动频率变了。本来 1 秒钟应该完美振动 30,000 次，现在老化后可能只能振动 29,999 次了。</li>
<li><strong>滚雪球般的 Offset（偏移值）</strong>：这意味着，<strong>每一秒钟它都少振动了一次</strong>。单看一秒钟，这微不足道的差值肉眼根本察觉不到；但如果不去管它，任由它运行几天、几周，这些“缺失的振动”就会像滚雪球一样不断累积。最终，你会发现这台机器的表比标准时间快了或慢了几十甚至上百毫秒——这就是我们常说的 <strong>Offset（时间偏移）</strong>。</li>
</ol>
<p>因此，硬件时间必然会漂移，绝不可能一劳永逸。</p>
<hr />
<h3>二、 连时间同步服务器自己，其实也会飘？</h3>
<p>细心的你可能会问：既然所有的石英钟都会漂移，那内网用来提供标准时间的时间同步服务器（主钟）它自己不也是一台电脑、也有石英钟吗？它难道不会飘吗？</p>
<p>答案是：<strong>它一样会飘！服务器的硬件不会自带抗漂移的特异功能。</strong></p>
<p>那为什么它还能当“标准”？秘诀在于<strong>“套娃式纠错”</strong>：</p>
<ol>
<li><strong>顶层的绝对标准</strong>：天上的北斗/GPS卫星上带着极度精准的原子钟，几乎不飘。</li>
<li><strong>纠错速度远超漂移速度</strong>：内网的授时服务器虽然自己也会飘，但它连着屋顶的北斗天线。它的石英钟刚想偷偷飘走，还没等产生大偏差，天线传来的卫星信号就把它<strong>“强行拽回来”</strong>了。</li>
<li><strong>层层分发</strong>：时间服务器充当了稳压器的角色。它不断修正自己的偏差，然后把精准的时间源源不断分发给底层的 SCADA 系统。</li>
</ol>
<hr />
<h3>三、 为什么分布式系统更怕“时间乱了”？</h3>
<p>如果只是单机办公，时间慢个几秒钟无所谓。但在现代工业系统里，情况完全变了。</p>
<p>工业系统是一个典型的<strong>分布式网络</strong>——成百上千台散落在各处的服务器、工作站、PLC 和测控单元需要联合起来干活。</p>
<ul>
<li>每一台机器都是一个“孤岛”，各自带着一块由于硬件老化和温度不同而正在悄悄变快或变慢的“表”。</li>
<li>如果没有外力把大家的表“强行拉回到同一个拍子里”，这些机器就会各自为战。当厂区不同角落的设备在几毫秒内连续发生动作时，中央系统根本分不清究竟是谁先发生的、谁后发生的。</li>
</ul>
<hr />
<h3>四、 时间不同步，工业现场会发生什么灾难？</h3>
<p>在工业控制中，<strong>时间就是秩序</strong>。如果时间不同步，轻则报表紊乱，重则引发重大安全事故：</p>
<ol>
<li><strong>SOE 事件顺序颠倒（查不出事故原因）</strong>：电厂或化工发生故障时，保护装置动作和开关断开往往只发生在几十毫秒内。如果子站时间不同步，日志记录的顺序可能变成“先断开、后保护”，彻底误导技术人员查明真凶。</li>
<li><strong>时序大数据的逻辑崩塌</strong>：SCADA 依赖高精度时间戳来汇总成千上万个测点的历史趋势。如果时间错乱，把合规的业务逻辑顺序 <code>1, 2, 3</code> 变成了因果颠倒的 <code>1, 3, 2</code>，历史数据和批量入库的逻辑就会全面崩溃。</li>
</ol>
<hr />
<h3>五、 总结</h3>
<p>说白了，我们去做<strong>“系统时钟同步误差测试”</strong>（比如用 <code>w32tm</code> 连续采样检查 Offset），目的非常纯粹：<strong>就是要用数据来证明，我们有能力按住系统时间的“物理漂移”。</strong></p>
<p>通过这项测试，我们能看清并把控两个关键点：</p>
<ul>
<li>确认内网的授时服务器能够持续修正自身的硬件偏差，不掉链子；</li>
<li>确认分布式网络下的各个节点，在经历日常温差和硬件老化后，依然能被整齐划一地“拉在同一个拍子里”。</li>
</ul>
<blockquote>
<p>总结：最终，把误差稳稳控制在要求范围以内，确保工业现场的设备动作顺序不乱、历史数据不串行，让每一条采集到的控制指令和运行日志都真实、可信。</p>
</blockquote>]]></description>
    <pubDate>Tue, 01 Sep 2026 23:10:34 +0800</pubDate>
    <dc:creator>cesii</dc:creator>
    <guid>https://cesii.cn/130.html</guid>
</item>
<item>
    <title>理解国密算法三剑客：SM2、SM3、SM4</title>
    <link>https://cesii.cn/gmtest/128.html</link>
    <description><![CDATA[<blockquote>
<p>在商用密码应用安全性评估（简称“密评”）以及日常的网络安全评估中，国密算法（SM2、SM3、SM4）的落地应用是核心考点。很多技术人员在面对抓包分析、协议握手和数据库落盘时，往往容易把各种算法的作用和组合方式记混。</p>
</blockquote>
<p>为了能先彻底搞懂、再结合实战应用，我们可以把这几个算法想象成一套“银行安保系统”，带大家从底层原理出发，一路看到抓包实战与数据库落盘。</p>
<h1>一、 算法三剑客：各司其职的“安保小队”</h1>
<p>用一个通俗的生活场景来对号入座，这三个算法的作用一目了然：</p>
<p><strong>SM4</strong>（对称加密）—— 上了锁的运钞铁柜</p>
<p><strong>特点</strong>：加解密用的是同一把钥匙，速度极快。</p>
<p><strong>作用</strong>：专门用来保护海量数据的机密性（防止别人看）。箱子锁上后，别人拿到了也看不懂里面的明文。</p>
<p><strong>SM2</strong>（非对称加密/签名）—— 双钥防伪信箱 / 专属数字印章</p>
<p><strong>特点</strong>：成对出现，分为公钥（公开投递）和私钥（自己开箱）。</p>
<p><strong>作用</strong>：专门用来做身份鉴别和数字签名（防止别人假冒，证明“你真的是你”）。</p>
<p><strong>SM3</strong>（杂凑/哈希算法）—— 火眼金睛的 24 小时电子哨兵</p>
<p><strong>特点</strong>：单向不可逆，具有“雪崩效应”（哪怕改动一个标点符号，算出来的特征码都会面目全非）。</p>
<p><strong>作用</strong>：不管输入多大的文件，它都能瞬间算出一段独一无二的“数字指纹”。只要内容被动过，指纹立刻对不上。</p>
<h1>二、 实战演练：从抓包看网络传输与身份鉴别</h1>
<p>理解了底层原理后，我们在分析系统登录或通信时，通过 Wireshark 抓包（如 TLCP 国密双向协议），就能一眼认出它们在不同阶段的协同作战：</p>
<h2>1. 身份鉴别阶段：SM2 + SM3</h2>
<p>在哪里看：在 TLS/TLCP 握手包中的 Certificate（证书） 环节。</p>
<p>怎么用：服务器会出示自己的国密双证书（签名证书和加密证书）。证书内部的公私钥以及防伪数字签名正是基于 <code>SM2-with-SM3</code> 算法。</p>
<p>目的：客户端通过验证这个签名，确认正在连接的是“官方正品”服务器，完美防范钓鱼劫持。</p>
<h3>整体流程</h3>
<p><img src="https://cesii.cn/content/uploadfile/202608/4e171786852941.jpg" alt="mermaid" /></p>
<h3>抓包记录：</h3>
<p><img src="https://cesii.cn/content/uploadfile/202608/fb331786859829.png" alt="" /></p>
<h2>2. 数据传输阶段：SM4 + SM3</h2>
<p>在哪里看：在 Server Hello 报文的 Cipher Suite（密码套件） 中（例如常见的<code>ECC_SM4_CBC_SM3</code>）。</p>
<p>怎么用：服务器在握手中“拍板”选定传输算法。后续双方向后传输的所有业务数据，都会通过 SM4 进行对称加密（防窃听），同时嵌入 SM3 保证数据在网上传输时没有被中间人篡改（防篡改）。</p>
<h3>整体流程</h3>
<p><img src="https://cesii.cn/content/uploadfile/202608/e6f81786853126.jpg" alt="mermaid" /></p>
<h2>3.数据存储安全 SM4 + HMAC-SM3</h2>
<p>数据在网络上安全传输到达服务器后，解密并写入数据库，这就进入了数据存储安全阶段。在这里，合规的关键不仅在于“加密”，更在于“<strong>防篡改</strong>”。</p>
<p>很多系统仅仅对敏感字段做了 SM4 加密落盘，却忽略了完整性保护，这在密评中是典型的缺陷。为了防范内部高权限管理员或黑客绕过应用层、直接在数据库后台偷偷修改密文，HMAC-SM3（基于密钥的杂凑消息认证码）就登场了。</p>
<h5>1. 为什么纯 SM3 还不够？必须用 HMAC-SM3？</h5>
<p>纯 SM3 就像是一份公开的“防伪指纹”，任何人只要拿到数据都可以重新算一遍。如果黑客在后台偷偷篡改了密文，顺手用纯 SM3 重新算了个新指纹换上去，系统就可能被骗过。</p>
<p><code>HMAC-SM3</code> 在 SM3 的基础上强行引入了一个只有系统内部知道的“秘密密钥（Secret Key）”。黑客虽然能改数据，但他没有这个秘密密钥，根本无法伪造出合法的指纹。只要数据被动过，系统一校验就会立刻报警。</p>
<h5>2. HMAC-SM3 在数据库里是怎么落地的？（效果展示）</h5>
<p>在实际企业级 Java 开发中（如配合 Hutool 工具包），HMAC-SM3 的落地方案主要有两种：</p>
<h3>方案一：独立成列（字段分开存）</h3>
<p>数据库表结构中，除了常规的密文字段，专门开辟一列来存放校验码。</p>
<pre><code class="language-java">import cn.hutool.crypto.digest.HMac;
import cn.hutool.crypto.digest.HmacAlgorithm;

public class Sm3MacDemo {
    public static void main(String[] args) {
        byte[] secretKey = "my_secret_key_16".getBytes();
        // 使用 HmacSM3 算法
        HMac hMac = new HMac(HmacAlgorithm.HmacSM3, secretKey);

        String ciphertext = "7d8f9b2c4e5a6789abcdef0123456789"; // 模拟 SM4 密文
        String macHex = hMac.digestHex(ciphertext); // 计算防伪指纹

        System.out.println("密文存入列: " + ciphertext);
        System.out.println("MAC存入列:   " + macHex);
    }
}</code></pre>
<p>数据库实际查出来的展示效果:</p>
<p><img src="https://cesii.cn/content/uploadfile/202608/2ee41786853259.png" alt="" /></p>
<p><strong>特点</strong>：结构直观，做密评或审计时一目了然</p>
<h3>方案二：融合打包（密文与 MAC 拼成一个字段）</h3>
<p>为了保持数据库表结构简洁，不增加新列，很多加密组件会将密文与校验码像“肉夹馍”一样打包存入同一个字段中。</p>
<pre><code class="language-java">import cn.hutool.crypto.digest.HMac;
import cn.hutool.crypto.digest.HmacAlgorithm;
import cn.hutool.core.util.HexUtil;

public class FusionDemo {
    public static void main(String[] args) {
        byte[] secretKey = "my_secret_key_16".getBytes();
        HMac hMac = new HMac(HmacAlgorithm.HmacSM3, secretKey);

        byte[] ciphertextBytes = HexUtil.decodeHex("7d8f9b2c4e5a6789abcdef0123456789");
        byte[] macBytes = hMac.digest(ciphertextBytes);

        // 融合打包：将密文字节与 MAC 字节拼在一起，再转成 Hex
        byte[] fusedBytes = new byte[ciphertextBytes.length + macBytes.length];
        System.arraycopy(ciphertextBytes, 0, fusedBytes, 0, ciphertextBytes.length);
        System.arraycopy(macBytes, 0, fusedBytes, ciphertextBytes.length, macBytes.length);

        String storedValue = HexUtil.encodeHexStr(fusedBytes);
        System.out.println("数据库单一字段存入: " + storedValue);
    }
}</code></pre>
<p>数据库实际查出来的展示效果：</p>
<p><img src="https://cesii.cn/content/uploadfile/202608/95c21786854436.png" alt="" /></p>
<p>效果：表面上看是一长串连续的 Hex 字符（前半部分为 SM4 密文，末尾直接粘着 HMAC-SM3 指纹），对业务表结构零侵入。</p>
<h3>整体流程</h3>
<p><img src="https://cesii.cn/content/uploadfile/202608/ed721786854476.jpg" alt="mermaid" /></p>
<h3>抓包记录：</h3>
<p><img src="https://cesii.cn/content/uploadfile/202608/04ed1786859960.png" alt="" /></p>
<h1>四、 总结速查表</h1>
<p>将这三个阶段串联起来，国密算法在系统中的全生命周期防护便一目了然：</p>
<p><img src="https://cesii.cn/content/uploadfile/202608/b13a1786854559.png" alt="" /></p>]]></description>
    <pubDate>Sun, 16 Aug 2026 11:14:01 +0800</pubDate>
    <dc:creator>cesii</dc:creator>
    <guid>https://cesii.cn/gmtest/128.html</guid>
</item>
<item>
    <title>密评学习（一）：用wireshark抓包证明国密通信链路</title>
    <link>https://cesii.cn/gmtest/127.html</link>
    <description><![CDATA[<blockquote>
<p>在商用密码应用安全性评估（简称「密评」）项目中，验证应用系统是否真正合规地启用了国密通信链路，最直接、最无懈可击的技术证据就是<strong>网络抓包与密码套件分析</strong>。本文将记录一套精简、高效的国密传输验证方案：不需要繁杂的中间代理，直接通过网卡捕获国密浏览器与国密网关的交互流量，并利用现代版 Wireshark 深度剖析 <strong>TLCP（GB/T 38636）</strong> 协议及 <strong>SM2 / SM3 / SM4</strong> 密码套件。</p>
</blockquote>
<h2>一、核心工具准备</h2>
<table>
<thead>
<tr>
<th>角色</th>
<th>工具</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>测试环境</td>
<td>具备国密的测试环境</td>
<td>传输加密验证</td>
</tr>
<tr>
<td>抓包工具</td>
<td>Linux 服务端原生 <code>tcpdump</code></td>
<td>网卡级捕获，无中间代理干扰</td>
</tr>
<tr>
<td>国密客户端</td>
<td>奇安信可信浏览器</td>
<td>原生支持国密 NTLS / TLCP 协议直连</td>
</tr>
<tr>
<td>分析工具</td>
<td>Wireshark <strong>4.0 及以上</strong></td>
<td>老旧版本无法正确解析国密 TLCP 协议树</td>
</tr>
</tbody>
</table>
<hr />
<blockquote>
<p>注意：使用wireshark版本一定是4.0+版本，从github官方得知只有4.0以上的版本才支持国密。</p>
</blockquote>
<p><img src="https://cesii.cn/content/uploadfile/202608/12cc1786241466.png" alt="" /></p>
<h2>二、服务端纯净抓包</h2>
<p>为了确保抓到的流量是标准的国密握手协议，不被任何国际标准中间代理干扰，应让国密浏览器与目标服务建立<strong>直连</strong>。<br />
在服务器端，绑定对应的公网网卡（例如 <code>ens33</code>），对业务端口（如 <code>4443</code>）进行流量捕获：<br />
<code>tcpdump -i ens33 -nn -w /tmp/pure_gm_verify.pcap port 4443</code></p>
<p>随后，使用奇安信可信浏览器直接访问国密服务地址（如 <a href="https://your-server-ip:4443）。业务交互完成后，在终端按下">https://your-server-ip:4443）。业务交互完成后，在终端按下</a> Ctrl + C 停止抓包，生成 .pcap 取证文件。</p>
<p><img src="https://cesii.cn/content/uploadfile/202608/67eb1786238963.png" alt="" /></p>
<h2>三、Wireshark 流量加载与精准过滤</h2>
<p>将抓包文件下载到本地，用4.0以上版本的 Wireshark 打开。由于抓包中会夹杂大量 TCP 基础状态包，需使用显示过滤器提升分析效率。</p>
<p>在顶部显示过滤器输入框中输入：<code>tls</code>后剩下的大部分就是TLCP协议了，这个TLCP就是我们要的国密通信包协议，对应国标<code>GB/T 38636-2020</code></p>
<blockquote>
<p>注意： 在 Wireshark 底层实现中，我国的国密 TLCP 协议解析模块被统一归纳在 tls 协议树下。</p>
</blockquote>
<p><img src="https://cesii.cn/content/uploadfile/202608/b8ac1786239154.png" alt="" /></p>
<h2>四、锁定核心硬核证据（协议版本与密码套件）</h2>
<p>在 Wireshark 展开的包详情中，可直接提取密评所需的关键合规证据。</p>
<ol>
<li>确认国密 TLCP 协议版本<br />
在 Client Hello 与 Server Hello 报文中，协议版本清晰显示为：</li>
</ol>
<p>Version: TLCP (0x0101)，对应国家标准 <strong>GB/T 38636</strong>。</p>
<ol start="2">
<li>锁定国密密码套件（核心判定项）<br />
在 Server Hello 展开项中，可以看到成功协商出的国密套件：</li>
</ol>
<p>Cipher Suite: ECC_SM4_CBC_SM3 (0xe013)</p>
<p><img src="https://cesii.cn/content/uploadfile/202608/d4a21786239254.png" alt="" /></p>
<p>这一行密码套件直接给出了合规判定依据，其算法分工如下：</p>
<table>
<thead>
<tr>
<th>组件</th>
<th>算法</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td>ECC</td>
<td>SM2</td>
<td>通信双方的身份鉴别与密钥协商</td>
</tr>
<tr>
<td>SM4_CBC</td>
<td>SM4</td>
<td>应用层业务数据对称加密传输（机密性）</td>
</tr>
<tr>
<td>SM3</td>
<td>SM3</td>
<td>消息杂凑与报文校验（完整性）</td>
</tr>
</tbody>
</table>
<h2>五、总结</h2>
<p>通过上述精简的「直连抓包 + 现代 Wireshark 验证」方案，可直击底层协议本质。</p>]]></description>
    <pubDate>Sun, 09 Aug 2026 09:17:42 +0800</pubDate>
    <dc:creator>cesii</dc:creator>
    <guid>https://cesii.cn/gmtest/127.html</guid>
</item>
<item>
    <title>Nginx 在 Windows 下的 1024 并发魔咒：JMeter 压测踩坑实录与终极解决方案</title>
    <link>https://cesii.cn/jmeter/125.html</link>
    <description><![CDATA[<p>在最近的一次系统性能压测项目中，系统架构选型为：<strong>前端 -&gt; Nginx (部署在 Windows Server) -&gt; Spring Boot (内置 Tomcat) 集群</strong>。</p>
<p>起初，在低并发下一切正常。但当将 JMeter 的并发线程数拉升到 400 甚至 1000 时，在 Nginx 网关层发生了雪崩。JMeter 监控面板满屏飘红，大面积报出 <code>504 Gateway Timeout</code> 和服务器连接异常。</p>
<p>打开了 Nginx 的 <code>error.log</code>，里面有一条错误日志一直在刷屏：</p>
<pre><code>[error] ... maximum number of descriptors supported by select() is 1024 while connecting to upstream</code></pre>
<p><img src="https://cesii.cn/content/uploadfile/202607/505a1785315608.png" alt="" /></p>
<p>如果在 Windows 环境下使用 Nginx 做反向代理，在日志里看到了这句报错，那么恭喜你，你撞上了性能测试界最经典的“叹息之墙”。本文将从底层原理出发，带你彻底拆解这个并发毒瘤，并给出真实有效的破局方案。</p>
<hr />
<h2>一、 为什么是 1024？揭开底层的双重限制</h2>
<p>这个问题其实是操作系统的历史包袱与 Nginx 软件设计妥协共同作用的结果：</p>
<h3>1. Windows 的 <code>select()</code> 宏限制（不可逾越的红线）</h3>
<p>在 Windows 系统的 C 语言底层网络库（Winsock）中，<code>select()</code> 函数被用来监控网络连接状态。为了防止该函数消耗过多系统资源，微软在标准头文件里死死地写了一个硬编码宏定义：</p>
<pre><code>#define FD_SETSIZE 1024</code></pre>
<p>这就意味着，任何调用原生 <code>select()</code> 的程序，其底层数组最多只能塞下 1024 个 Socket 句柄。一旦超出，程序内部直接溢出报错。</p>
<h3>2. Nginx 官方的妥协（基因缺陷）</h3>
<p>Nginx 之所以能在 Linux 上实现千万级并发，靠的是先进的 <code>epoll</code> 异步事件驱动模型。而 Windows 系统最高效的网络并发模型是内核级的 <strong>IOCP（完成端口）</strong>。</p>
<p>由于 <code>epoll</code> 和 <code>IOCP</code> 的架构设计截然相反，Nginx 官方为了省事，并没有为 Windows 平台重写底层核心，而是直接调用了最通用但效率最低的 <code>select()</code> 函数。</p>
<blockquote>
<p><strong>结论：</strong> 官方原版的 Windows Nginx 就是一个带着基因缺陷的“残血测试版”。由于 Nginx 代理一个请求需要占用 2 个句柄（连客户端 1 个，连后端 1 个），<strong>在 Windows 下，Nginx 的实际并发处理上限其实只有 500 左右</strong>。这与服务器的物理内存有多大、注册表怎么改，毫无关系。</p>
</blockquote>
<hr />
<h2>二、 冲破 1024 结界：Windows 环境下的高并发破局方案</h2>
<p>如果生产环境或测试环境必须使用 Windows Server，且面临上千并发的业务指标，有以下三条路可以走：</p>
<h3>方案一：使用第三方魔改编译版 Nginx（成本最低，见效最快）</h3>
<p>既然官方不改 <code>FD_SETSIZE</code>，就有开源社区的民间大神下载 Nginx 源码，强行将该宏定义修改至 4096 甚至更高，并利用 Windows 特性重新编译。</p>
<ul>
<li><strong>推荐分支：</strong> Github 上的 <code>nginx-win</code> 编译版（如 WhiteKnight 或 SnapDragonfly 分支）,下载地址：<a href="http://nginx-win.ecsds.eu/download/" title="http://nginx-win.ecsds.eu/download/">http://nginx-win.ecsds.eu/download/</a></li>
</ul>
<p><img src="https://cesii.cn/content/uploadfile/202607/dd761785315930.png" alt="" /></p>
<ul>
<li><strong>避坑指南：</strong>
<ul>
<li>1. 下载解压后，<strong>千万不要运行 <code>nginx.exe</code></strong>（极易报 <code>0xc000007b`</code> 运行库错误），请直接使用纯净版的 <strong><code>nginx_basic.exe</code></strong> 启动。</li>
<li>2. 务必双击运行安装包里自带的 <code>.reg</code> 注册表优化文件，配合放开 Windows 系统的 TCP 动态端口限制，可以看到basic版本的nginx句柄数已经完全放开。</li>
<li>3. 换上此版本后，你再将配置文件中的 <code>worker_connections</code> 改为 65535，才能真正生效。</li>
</ul></li>
</ul>
<p><img src="https://cesii.cn/content/uploadfile/202607/5c781785315723.png" alt="" /></p>
<h3>方案二：多 Nginx 实例 + 端口分流（物理堆叠法）</h3>
<p>既然单个进程只能承受 1024 个句柄，那么我们可以在同一台 Windows Server 上启动 4 个 Nginx 实例，分别监听不同的端口（例如 8931-8934）。</p>
<p>在压测时，利用 JMeter 的参数化功能，将 1000 并发流量随机打散到这 4 个端口上。每个实例分担 250 个并发，完美绕过单进程的硬性上限。</p>
<h3>方案三：替换为 IIS 或 Apache（生产环境终极建议）</h3>
<p>如果在 Windows 上搞高并发架构，微软的“亲儿子” <strong>IIS (Internet Information Services)</strong> 才是王道。IIS 底层基于内核级的 <code>HTTP.sys</code> 驱动，天生融合 IOCP 模型。如果系统未来要在生产环境中长期应对大流量，强烈建议抛弃 Windows 版 Nginx，改用 IIS 的 ARR (Application Request Routing) 插件来做七层反向代理。</p>
<hr />
<h2>三、💡 后记</h2>
<p>性能调优就像剥洋葱，剥开外层的网关瓶颈，往往里面还藏着更深的应用层或代码级问题。希望这篇踩坑记录能帮你在 Windows 高并发调优的路上少走弯路。</p>]]></description>
    <pubDate>Wed, 29 Jul 2026 16:44:50 +0800</pubDate>
    <dc:creator>cesii</dc:creator>
    <guid>https://cesii.cn/jmeter/125.html</guid>
</item>
<item>
    <title>撕开异步接口的“遮羞布”：为什么说它只是个障眼法？</title>
    <link>https://cesii.cn/jmeter/41.html</link>
    <description><![CDATA[<p>在性能测试与系统架构的圈子里，存在一个心照不宣的<strong>“幻觉”</strong>：遇到耗时极长的业务逻辑，只要把它改成异步接口，性能问题就迎刃而解了。</p>
<p>当你用 JMeter 对着这样的接口进行高并发负载测试时，控制台满屏都是绿色的 <code>200 OK</code>，平均响应时间只有十几毫秒。此时，开发团队弹冠相庆，老板看着漂亮的 TPS 数据非常满意。</p>
<p><img src="https://cesii.cn/content/uploadfile/202607/726e1783906370.png" alt="" /></p>
<p>但作为性能测试工程师，你看着后台依然慢如蜗牛的数据落盘速度，心里应该比谁都清楚：<strong>这根本不是性能优化，这彻头彻尾就是一场“障眼法”。</strong></p>
<p><img src="https://cesii.cn/content/uploadfile/202607/ddc11783906410.png" alt="" /></p>
<hr />
<h2>一、 异步接口的本质：一个伪装成“快”的巨大水缸</h2>
<p>要揭开这个障眼法，我们必须先认清异步的物理本质。</p>
<p>把系统的数据处理能力想象成一根<strong>细水管</strong>。当海量的请求（比如通过合同压力测试数据引擎，瞬间涌入数十万条基于复杂 Excel 模板生成的定制化合同数据）砸向这根细水管时，水管注定会堵死。</p>
<p>改成异步接口后，开发做的事情并不是把水管变粗，而是在水管前面放了一个<strong>大水缸</strong>（消息队列或内存池）。</p>
<ul>
<li><strong>前端体验“变快”了：</strong> 接口只负责把数据扔进水缸，然后立刻告诉客户端“接收成功”。</li>
<li><strong>后端处理“照旧”慢：</strong> 水缸里的水，依然只能顺着那根细水管，一滴一滴地流向底层的<strong>达梦 (DM) 数据库</strong>。</li>
</ul>
<blockquote>
<p><strong>残酷的结论：</strong><br />
异步仅仅解决了接入层的高可用和前端的防卡死，它对提升后端真实的数据吞吐量（Throughput）和业务处理速度<strong>毫无作用</strong>。甚至因为引入了队列组件，整体的端到端耗时反而更长了。</p>
</blockquote>
<hr />
<p><img src="https://cesii.cn/content/uploadfile/202607/e5531783906469.png" alt="" /></p>
<h2>二、 掩耳盗铃的代价：当“雪崩”在后台静默发生</h2>
<p>这种用异步掩盖性能瓶颈的做法，在面对真正的极限压力时，会引发比“接口响应慢”更可怕的灾难。</p>
<ul>
<li><strong>隐性资源耗尽：</strong> 接口虽然返回了成功，但后台消费线程仍在疯狂运转。如果是单线程在死磕海量数据，应用服务器的 CPU 会长时间处于高水位。这会导致部署在同一网关或 <strong>TongWeb 中间件</strong>上的其他核心同步业务，莫名其妙地出现线程池阻塞和连接超时。</li>
<li><strong>危险的“背压 (Backpressure)”：</strong> 当上游扔数据的速度（TPS 极高）远远大于下游消费的速度时，水缸总有满的一刻。一旦队列积压达到极限，系统迎来的将是<strong>内存溢出 (OOM)</strong> 或者大面积的消息丢失。</li>
<li><strong>失去意义的测试指标：</strong> 如果几百万条数据导入，后端依然需要几个小时才能跑完，那么前端那 <code>15ms</code> 的响应时间和 <code>2000</code> 的 TPS 指标就成了一张废纸。业务的真实性能依然是不及格的。</li>
</ul>]]></description>
    <pubDate>Mon, 13 Jul 2026 09:26:13 +0800</pubDate>
    <dc:creator>cesii</dc:creator>
    <guid>https://cesii.cn/jmeter/41.html</guid>
</item>
<item>
    <title>商用密码评估中，测评二级系统和三级系统核心差异</title>
    <link>https://cesii.cn/123.html</link>
    <description><![CDATA[<p>目前大部分的系统定级都在二级或者三级，在商用密码应用安全性评估（密评）中，二级系统和三级系统的改造要求存在巨大的“鸿沟”。三级系统追求的是“<strong>强制合规、严防死守</strong>”，而二级系统更偏向于“<strong>基础防护、风险可控</strong>”。</p>
<p>以下是密评中三级系统与二级系统改造要求的核心差异列表：</p>
<h2>🛡️ 1. 身份鉴别（登录认证）</h2>
<p>三级系统（强制强认证）：必须采用密码技术进行强身份鉴别。通常要求使用基于 SM2 算法的国密数字证书（如 UKey、手机盾、国密VPN证书等）进行双因子或多因子认证，严防身份伪造。</p>
<p>二级系统（基础认证即可）：不强制要求使用国密数字证书。通常只要具备基础的账号密码复杂度要求、定期更换密码以及基本的权限分离即可。</p>
<p>💡 <strong>改造差异</strong>：三级系统必须采购和部署国密证书认证体系；二级系统通常不需要额外改造，沿用现有的账号密码体系即可。</p>
<h2>💾 2. 重要数据存储机密性（防泄密）</h2>
<p>三级系统（强制加密）：对于重要数据（如用户隐私信息、业务核心数据、服务端敏感日志等），在落盘存储时必须（应）采用密码技术（如 SM4 算法）保证其机密性。</p>
<p>二级系统（非强制加密）：对数据存储的机密性通常没有强制的“应”要求，更多是建议性（“宜”）要求。</p>
<p><strong>💡 改造差异</strong>：三级系统必须引入密码机或密钥管理系统，对数据库、文件块等进行 SM4 加密（如 TDE 透明加密）；二级系统可以保持明文存储，不需要强制做存储加密改造。</p>
<h2>🌐 3. 数据传输机密性（防窃听）</h2>
<p>三级系统（强制国密通道）：通信过程中必须（应）采用合规的密码技术保证数据的机密性和完整性。这意味着必须建立基于国密算法套件（SM2/SM3/SM4）的加密通道（如国密 SSL VPN、国密 HTTPS）。</p>
<p>二级系统（非强制国密）：对通信数据的机密性保护通常是“宜”或“可”的级别，使用普通的国际算法 HTTPS（RSA/AES）通常也能被接受。</p>
<p><strong>💡 改造差异</strong>：三级系统必须替换国际算法证书，部署国密 SSL 证书或强制流量走国密 VPN；二级系统不需要强制替换为国密传输通道。</p>
<h2>📝 4. 完整性保护与审计（防篡改）</h2>
<p>三级系统（强制防篡改）：要求对通信数据、系统访问控制信息、重要日志记录等进行完整性保护（如使用 SM3 算法做数字签名或哈希校验），且审计日志必须集中存储、防篡改并留存 6 个月以上。</p>
<p>二级系统（基础记录即可）：对完整性保护和日志审计的要求非常宽松，日志通常只需本地存储，没有强制的防篡改和长周期留存要求。</p>
<p><strong>💡 改造差异</strong>：三级系统必须部署日志审计平台并引入签名验签机制；二级系统不需要专门为了防篡改去改造日志系统。</p>
<h2>🔑 5. 密钥管理（核心底座）</h2>
<p>三级系统（全生命周期管控）：必须建立完善的密钥管理系统，对密钥的生成、存储、分发、更新、归档、销毁进行全生命周期的安全管控，且必须使用经过国家认证的合规密码产品（如服务器密码机）。</p>
<p>二级系统（基础管控）：密钥管理要求较低，通常只需保证密钥不明文硬编码在代码中，进行基础的妥善保管即可。</p>
<p><strong>💡 改造差异</strong>：三级系统必须采购硬件密码机或合规的云密码服务；二级系统不需要强制采购昂贵的硬件密码设备。</p>
<table>
<thead>
<tr>
<th style="text-align: left;">核心改造环节</th>
<th style="text-align: left;">三级系统要求（强制合规）</th>
<th style="text-align: left;">二级系统要求（基础防护）</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">身份鉴别</td>
<td style="text-align: left;">必须使用国密数字证书（SM2）强认证</td>
<td style="text-align: left;">基础账号密码即可，不强制证书</td>
</tr>
<tr>
<td style="text-align: left;">数据存储</td>
<td style="text-align: left;">必须使用 SM4 加密重要数据</td>
<td style="text-align: left;">可不加密，明文存储通常合规</td>
</tr>
<tr>
<td style="text-align: left;">数据传输</td>
<td style="text-align: left;">必须建立国密（SM2/3/4）加密通道</td>
<td style="text-align: left;">普通 HTTPS 即可，不强制国密</td>
</tr>
<tr>
<td style="text-align: left;">日志审计</td>
<td style="text-align: left;">必须集中存储、SM3防篡改、留存≥6个月</td>
<td style="text-align: left;">本地存储即可，无强制防篡改要求</td>
</tr>
<tr>
<td style="text-align: left;">密钥管理</td>
<td style="text-align: left;">必须使用合规密码机全生命周期管控</td>
<td style="text-align: left;">基础妥善保管，不强制硬件设备</td>
</tr>
</tbody>
</table>]]></description>
    <pubDate>Wed, 13 May 2026 00:45:10 +0800</pubDate>
    <dc:creator>cesii</dc:creator>
    <guid>https://cesii.cn/123.html</guid>
</item>
<item>
    <title>Web安全常见问题-CSP</title>
    <link>https://cesii.cn/web-safe/46.html</link>
    <description><![CDATA[<h1>一、先搞懂：CSP到底是干嘛的？</h1>
<p>CSP（Content Security Policy，内容安全策略），是浏览器层面为了防御XSS（跨站脚本攻击）而生的终极安全机制。</p>
<p>你可以把它理解成网站给浏览器装的一道「安全防盗门」：</p>
<ul>
<li>
<p>正常的CSP，会给浏览器列一份「白名单」：只允许加载/执行白名单里的可信资源（比如自己服务器的JS、可信CDN的样式）。</p>
</li>
<li>
<p>不在白名单里的资源、内联脚本、恶意代码，浏览器会直接拦截，从根源上阻断XSS攻击。</p>
</li>
</ul>
<p>而我们遇到的所有问题，本质都是：亲手给这道防盗门开了无数个大洞，让CSP彻底形同虚设。</p>
<h1>二、CSP高危漏洞全拆解</h1>
<h2>1. 漏洞1：CSP中允许内联脚本执行（高危）</h2>
<h3>漏洞名称</h3>
<p>CSP中允许内联脚本执行</p>
<h3>漏洞原因</h3>
<p>在<code>script-src</code>指令中配置了<code>'unsafe-inline'</code>，强制浏览器放行所有内联脚本（包括直接写在HTML里的<code>&lt;script&gt;</code>代码、<code>onclick</code>等内联事件）。</p>
<ul>
<li>
<p>正常CSP默认禁止所有内联脚本，只有手动添加<code>'unsafe-inline'</code>才会放行。</p>
</li>
<li>
<p>这个配置等于告诉浏览器：“不管是我自己写的正常JS，还是黑客注入的恶意内联脚本，全给我放行”，直接废掉了CSP的核心防护。</p>
</li>
</ul>
<h3>风险后果</h3>
<p>黑客只要能在网站任何输入点（评论区、个人资料、URL参数）注入一段恶意内联脚本，就能直接在用户浏览器执行，偷取Cookie、盗号、弹钓鱼广告，XSS攻击零门槛。</p>
<h3>解决方案</h3>
<ul>
<li>
<p>将所有内联脚本、内联事件提取到独立的<code>.js</code>外部文件，彻底删除<code>'unsafe-inline'</code>。</p>
</li>
<li>
<p>必须保留内联脚本的场景：使用<code>nonce</code>（随机数）或<code>hash</code>（脚本哈希）白名单，仅放行可信内联脚本，不全局开放。</p>
</li>
</ul>
<h2>2. 漏洞2：在CSP中的不安全URL方案（高危）</h2>
<h3>漏洞名称</h3>
<p>CSP中使用不安全URL方案（<code>data:</code>/<code>blob:</code>）</p>
<h3>漏洞原因</h3>
<p>在<code>script-src</code>等指令中配置了<code>data:</code>和<code>blob:</code>协议，允许浏览器加载/执行用这两个协议打包的资源。</p>
<ul>
<li>
<p><code>data:</code>/<code>blob:</code>是特殊的打包协议，可以把JS、图片等资源直接编码嵌在URL里，不用单独存成文件。</p>
</li>
<li>
<p>开放<code>data:</code>/<code>blob:</code>给脚本，等于给黑客开了“把恶意代码藏在特殊链接里进门”的大门，CSP完全无法拦截。</p>
</li>
</ul>
<h3>风险后果</h3>
<ul>
<li>黑客可以把恶意JS转成base64，用<code>data:text/javascript;base64,xxx</code>的形式注入，浏览器直接执行，结合<code>'unsafe-inline'</code>形成双重漏洞叠加，XSS攻击成功率拉满。</li>
</ul>
<p>解决方案：</p>
<ul>
<li>
<p>直接从<code>script-src</code>中删除<code>data:</code>和<code>blob:</code>，仅给图片（<code>img-src</code>）等非脚本资源按需放行。</p>
</li>
<li>
<p>必须使用的场景：严格限制仅放行特定类型（如仅图片），绝对不允许脚本类型的<code>data:</code>/<code>blob:</code>。</p>
</li>
</ul>
<h2>3. 漏洞3：在源指令中过度使用宽泛的通配符（高危）</h2>
<h3>漏洞名称</h3>
<p>CSP源指令过度使用<code>*</code>通配符</p>
<h3>漏洞原因</h3>
<p>在<code>script-src</code>、<code>base-uri</code>、<code>form-action</code>等指令中使用了<code>*</code>通配符，代表“允许任意来源的所有资源”。</p>
<ul>
<li>
<p>正常CSP应该只放行可信域名（如<code>'self'</code>、可信CDN域名），<code>*</code>通配符等于完全放弃白名单能力。</p>
</li>
<li>
<p>这个配置等于告诉浏览器：“不管脚本来自哪个网站，是合法的还是黑客的，全给我放行”。</p>
</li>
</ul>
<h3>风险后果</h3>
<p>黑客可以从任何恶意网站、广告链接引入恶意JS，网站毫无阻拦地执行，彻底失去来源管控能力，XSS、数据泄露风险极高。</p>
<h3>解决方案</h3>
<ul>
<li>
<p>彻底删除所有<code>*</code>通配符，替换为具体可信域名，如<code>script-src 'self' https://trusted.cdn.com</code>。</p>
</li>
<li>
<p>核心原则：脚本（<code>script-src</code>）绝对禁止使用<code>*</code>通配符，仅在必要的非脚本资源中谨慎使用。</p>
</li>
</ul>
<h2>4. 漏洞4：绕过对象白名单配置（高危）</h2>
<h3>漏洞名称漏洞名称</h3>
<p>CSP对象源白名单绕过（<code>object-src</code>全放行）</p>
<h3>漏洞原因</h3>
<ul>
<li>
<p><code>object-src</code>指令配置为<code>* data: blob:</code>，无限制放行所有插件/嵌入式对象。</p>
</li>
<li>
<p><code>object-src</code>是CSP中专门管控Flash、<code>&lt;object&gt;/&lt;embed&gt;</code>等插件资源的指令，现代网站几乎不再使用这类插件。</p>
</li>
<li>
<p>全放行配置等于完全不限制插件来源，黑客可以注入恶意Flash/嵌入式对象，直接在用户浏览器执行。</p>
</li>
</ul>
<h3>风险后果</h3>
<p>黑客可以通过恶意插件执行任意代码，绕过CSP的脚本防护，实现提权、数据窃取等攻击，属于额外的攻击入口。</p>
<h3>解决方案</h3>
<ul>
<li>
<p>最优方案：直接配置<code>object-src 'none'</code>，完全禁用所有插件/嵌入式对象，现代网站99%场景适用，对业务零影响。</p>
</li>
<li>
<p>必须使用插件的场景：仅放行可信域名，绝对禁止<code>*</code>、<code>data:</code>、<code>blob:</code>。</p>
</li>
</ul>
<h2>5. 漏洞5：在CSP中使用了不安全的eval()（中危）</h2>
<h3>漏洞名称</h3>
<p>CSP中允许<code>'unsafe-eval'</code></p>
<h3>漏洞原因</h3>
<p>在<code>script-src</code>指令中配置了<code>'unsafe-eval'</code>，允许浏览器执行<code>eval()</code>、<code>new Function()</code>等动态代码。</p>
<ul>
<li>
<p>正常CSP默认禁止<code>eval()</code>执行，手动添加<code>'unsafe-eval'</code>才会放行。</p>
</li>
<li>
<p>这个配置等于给黑客开了“动态代码执行”的绿灯，黑客可以用<code>eval()</code>解密、变形恶意代码，绕过WAF和前端防护。</p>
</li>
</ul>
<h3>风险后果</h3>
<p>放大XSS攻击威力，让黑客可以用更隐蔽的方式注入恶意代码，即使有基础防护也能轻易绕过。</p>
<h3>解决方案</h3>
<ul>
<li>
<p>直接删除<code>'unsafe-eval'</code>，重构代码，用静态代码替代<code>eval()</code>等动态执行逻辑（如用<code>JSON.parse()</code>替代<code>eval()</code>解析JSON）。</p>
</li>
<li>
<p>必须使用的场景：严格限制使用范围，不全局开放<code>'unsafe-eval'</code>。</p>
</li>
</ul>
<h2>6. 低危补充：在CSP中未强制执行脚本中的可信类型</h2>
<h3>漏洞名称</h3>
<p>CSP未开启可信类型（Trusted Types）</p>
<h3>漏洞原因</h3>
<p>未配置<code>require-trusted-types-for 'script'</code>指令，未开启CSP的进阶DOM XSS防护。</p>
<ul>
<li>
<p>可信类型是CSP的扩展防护，强制浏览器只允许执行经过验证的可信脚本，拦截危险的DOM操作（如<code>innerHTML</code>）。</p>
</li>
<li>
<p>未配置该指令，等于没装“第二道锁”，DOM XSS风险依然存在。</p>
</li>
</ul>
<h3>风险后果</h3>
<p>属于锦上添花的防护缺失，优先级低于上述5个高危漏洞，不影响核心安全，但会降低XSS防护能力。</p>
<h3>解决方案</h3>
<ul>
<li>
<p>在CSP中添加<code>require-trusted-types-for 'script'; trusted-types default;</code>，开启可信类型防护。</p>
</li>
<li>
<p>前端无法适配的场景：可标记为低危不整改，不影响等保/密评合规。</p>
</li>
</ul>
<h1>三、所有CSP漏洞的本质总结</h1>
<p>很多人会觉得这是5个独立的问题，但实际上，它们的本质完全一致：</p>
<p>我们配置的CSP，不是在“防护”，而是在主动告诉浏览器：<br />
不管什么JS、谁发来的、哪里来的、用什么方式包装的，全都允许执行。</p>
<p>等于给网站装了防盗门，却亲手把锁拆了、门大开，还贴了纸条：“黑客请随意进”。</p>
<p>这5个配置同时存在，CSP的XSS防护等于彻底报废，没有任何防御能力，黑客可以从任何地方、用任何方法把恶意代码塞进来，浏览器全执行，没有任何阻拦。</p>
<h1>四、最终修复：一份可直接复制的安全CSP模板</h1>
<p>把所有高危配置一次性替换，给你一份零风险的标准CSP配置：</p>
<pre><code>Content-Security-Policy:
  # 默认只允许自家域名的资源
  default-src 'self';
  # 脚本只允许自家服务器，彻底删除unsafe-inline、unsafe-eval、data:、blob:、*
  script-src 'self';
  # 样式允许自家和inline（样式inline通常可保留，脚本inline必须删）
  style-src 'self' 'unsafe-inline';
  # 图片允许自家和data:（仅图片，脚本绝对不加）
  img-src 'self' data:;
  # 字体只允许自家
  font-src 'self';
  # 接口请求只允许自家
  connect-src 'self';
  # 媒体资源只允许自家
  media-src 'self';
  # 直接禁用所有插件，彻底堵死object-src漏洞
  object-src 'none';
  # 禁止篡改页面基础URL
  base-uri 'self';
  # 表单只能提交到自家域名
  form-action 'self';
  # iframe只允许自家
  frame-src 'self';
  # Worker脚本只允许自家
  worker-src 'self';
  # 子资源只允许自家
  child-src 'self';
  # 开启可信类型进阶防护（可选，前端适配后添加）
  # require-trusted-types-for 'script'; trusted-types default;</code></pre>
<h1>核心配置原则</h1>
<ol>
<li>
<p>脚本（<code>script-src</code>）绝对红线：禁止<code>'unsafe-inline'</code>、<code>'unsafe-eval'</code>、<code>data:</code>、<code>blob:</code>、<code>*</code>通配符，只放行可信域名。</p>
</li>
<li>
<p>非脚本资源按需放行：仅给图片、字体等非脚本资源，按需放行<code>data:</code>，绝不给脚本开放。</p>
</li>
<li>
<p>插件彻底禁用：<code>object-src 'none'</code>，现代网站完全用不到，零业务影响，彻底堵死漏洞。</p>
</li>
<li>
<p>通配符零容忍：所有指令彻底删除<code>*</code>，只配置具体可信域名。</p>
</li>
</ol>
<h1>五、修复后验证</h1>
<ol>
<li>
<p>浏览器控制台验证：打开F12控制台，查看是否有CSP相关报错，确保业务功能正常。</p>
</li>
<li>
<p>安全扫描验证：重新执行安全扫描，确认所有CSP相关告警已消除。</p>
</li>
<li>
<p>CSP校验工具验证：使用<a href="https://csp-evaluator.withgoogle.com/">CSP Evaluator</a>等工具，验证CSP策略的安全性。</p>
</li>
<li>
<p>等保/密评合规验证：确认配置符合等保2.0、密评的安全要求，无高危配置。</p>
</li>
</ol>
<h1>六、写在最后</h1>
<p>CSP是防御XSS的最后一道防线，而我们遇到的这些问题，本质都是“主动放弃了这道防线”。</p>
<p>很多时候，开发为了兼容业务、快速解决CSP拦截报错，会随手加上<code>'unsafe-inline'</code>、<code>*</code>、<code>data:</code>这些“万能钥匙”，却忽略了这些配置带来的致命安全风险。</p>
<p>CSP的核心是「<strong>限制</strong>」，不是「放行」。</p>]]></description>
    <pubDate>Sat, 11 Apr 2026 20:24:39 +0800</pubDate>
    <dc:creator>cesii</dc:creator>
    <guid>https://cesii.cn/web-safe/46.html</guid>
</item>
<item>
    <title>性能测试计时选型指南：按时间量级选择最优工具</title>
    <link>https://cesii.cn/121.html</link>
    <description><![CDATA[<!--wechat:http://mp.weixin.qq.com/s/bR0Ba70-DN1-7h1gYWjBIg?token=1367392738&lang=zh_CN-->
<p>作为一个测试工程师，在进行各类性能测试时，总会担心一个问题：</p>
<pre><code>**这个时间这么短，使用这个系统时间戳输出作为结果到底合不合理？这个时间又这么长，通过秒表的方式符合测试的要求么？</code></pre>
<p>往往出现这种情况时总会想：这几种情况有没有一个标准来解答这种情况呢？这种困惑在<code>纳秒级</code>、<code>毫秒级</code>、<code>秒级</code>、<code>分钟</code>、<code>小时</code>、<code>天</code>或者<code>周</code>等不同时间量级的测试中尤为突出，盲目的选择计时方式，轻则导致结果误差过大，重则影响性能瓶颈分析与解决方案的决策。从而梳理了在不同时间量级下的最优计时方案，为以后的测试中提供一个合适的参考。</p>
<h2><strong>一、毫秒级（ms）及以上</strong></h2>
<p><strong> 适用场景</strong></p>
<p>接口响应时间、业务流程总耗时、单机任务执行时长、分布式压测场景下的请求耗时等。</p>
<p>耗时范围<code>1ms~10ms</code>时，是日常性能测试中最常见的场景，这个时候可以选择<code>系统时间戳</code>、<code>专业性能测试工具（JMeter/LoadRunner/Locust）</code>。</p>
<h2><strong>二、秒级（s）及以上</strong></h2>
<p>耗时范围<code>1s-60s</code>时，这个时候除了可以选择<code>系统时间戳</code>、<code>专业性能测试工具（JMeter/LoadRunner/Locust）</code>，还可以选择<code>人工秒表计时</code>或者<code>工业级的计时工具</code>。</p>
<h2><strong>三、纳秒-微秒级（ns-μs）：硬件级高精度，杜绝误差</strong></h2>
<p><strong> 适用场景</strong></p>
<p>函数级指令耗时、硬件IO延迟、芯片级处理时延、短周期算法核心逻辑耗时等，耗时范围＜1ms（μs/ns级），对精度要求极致。</p>
<p>这个时候就要考虑使用<code>CPU TSC（时间戳计数器）</code>、<code>示波器</code>。</p>
<h2><strong>四、几十分钟至数小时长以上</strong></h2>
<p><strong> 适用场景</strong></p>
<p>完整算法执行、大规模数据处理、超算/DCU/FPGA平台全流程测试、系统稳定性压测等，耗时范围≥30min，核心关注总耗时与稳定性。</p>
<p>这个时候就可以考虑使用<code>手机秒表</code>、<code>工业级硬件秒表（支持外部触发、抗干扰强）``人工电子秒表</code></p>
<h2><strong>五、总结</strong></h2>
<p>作为测试工程师，面对不同时间量级的性能测试，<strong>“选对计时工具”是保证结果可信的第一步</strong>。</p>
<ul>
<li>毫秒级及以上任务，系统时间戳、专业压测工具、手机秒表均可灵活选用，精度足够且适配性强；</li>
<li>纳秒级任务必须依赖CPU TSC、示波器等硬件级高精度方案，杜绝普通系统时间戳的误差问题；</li>
<li>几十分钟至数小时的长周期任务，人工/手机/工业秒表是最合理、最可靠的选择。</li>
</ul>]]></description>
    <pubDate>Fri, 23 Jan 2026 22:30:21 +0800</pubDate>
    <dc:creator>cesii</dc:creator>
    <guid>https://cesii.cn/121.html</guid>
</item>
<item>
    <title>Jmeter测试时为什么会出现地址被占用（Address already in use）？</title>
    <link>https://cesii.cn/jmeter/117.html</link>
    <description><![CDATA[<p>&nbsp;在使用Jmeter进行压力测试时，当tps请求过高时就会出现大量的<strong>Address already in use</strong>错误，空闲时间了解了下原理，原因在于tcp端口不够用导致的。</p>
<p>单台windows最大tcp端口是65535个（默认1024个），客户端每发一次请求就会占据一个端口，如果超出这个数量或者说tcp端口释放比较的慢，就会出现被占用的错误。</p>
<p>JMeter默认是使用短链接方式（关闭 Keep-Alive）进行请求的，windows中端口默认释放时间是120s，即使这个请求结束后，如果还没到达端口释放的时间，这个端口会一直被占用状态。</p>
<p><img src="https://cesii.cn/content/uploadfile/202511/03a41763294971.png" alt="" /></p>
<h3>如何避免？</h3>
<h4>1、多机负载</h4>
<p>使用两台或更多的机器进行负载测试；</p>
<h4>2、虚拟机</h4>
<p>原理和多机负责其实是一个，只不过如果只有一台电脑，那这个时候我们就可以考虑开虚拟机的方式进行，当然要保证你的机器配置足够，否则即使用负载的方式进行也会因为资源不够导致结果不准确或者报错超时。</p>
<h4>3、开启Keep-Alive</h4>
<p><img src="https://cesii.cn/content/uploadfile/202511/453a1763295877.png" alt="" /><br />
打开Jmeter中的Keep-Alive后，可以让请求保持长链接的状态，而不是请求完就断开。</p>
<h4>4、修改Time_wait、最大连接数</h4>
<p>windows默认连接数1024个，这里将windows默认的tcp释放时间缩短，将tcp默认链接数量设置最大，在windows的<code>regedit</code>注册表中修改即可</p>
<p>cmd输入<code>regedit</code>进入到负载机的注册表，找到<code>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters</code>路径：<br />
<img src="https://cesii.cn/content/uploadfile/202511/68a01763296003.png" alt="" /><br />
在<code>Parmeters</code>右键新建DWORD值，命名为<code>MaxUserPort</code>，然后选择十进制并输入数据65534后保存<br />
<img src="https://cesii.cn/content/uploadfile/202511/646c1763296084.png" alt="" /></p>
<p>在同样的注册表位置新建<code>TcpTimeWaitDelay</code>，值类型DWORD，数值数据为5s(时间可以更短)<br />
<img src="https://cesii.cn/content/uploadfile/202511/66611763296312.png" alt="" /></p>
<p>确定后重启测试机即可。</p>]]></description>
    <pubDate>Sun, 16 Nov 2025 20:04:29 +0800</pubDate>
    <dc:creator>cesii</dc:creator>
    <guid>https://cesii.cn/jmeter/117.html</guid>
</item>
</channel>
</rss>