<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>我的博客</title><link>https://linxi-blog.pages.dev/</link><description>Recent content on 我的博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 27 Sep 2026 11:40:00 +0800</lastBuildDate><atom:link href="https://linxi-blog.pages.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>SQL 注入与 WAF 绕过：从规则失配到纵深防御</title><link>https://linxi-blog.pages.dev/posts/sql-injection-and-waf-defense/</link><pubDate>Sun, 27 Sep 2026 11:40:00 +0800</pubDate><guid>https://linxi-blog.pages.dev/posts/sql-injection-and-waf-defense/</guid><description>&lt;p&gt;SQL 注入长期位居 Web 安全风险的核心位置，并不是因为它“古老”，而是因为它直接触碰了应用安全中最根本的一条边界：&lt;strong&gt;数据与代码必须分离&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;当用户输入被拼接进 SQL 语句时，输入不再只是数据，而有机会改变语句结构。安全产品、输入过滤和 WAF 可以增加攻击成本，但它们不能替代安全的数据访问方式。本文讨论 SQL 注入的主要类型、WAF 绕过的本质、常见检测误区，以及更可靠的工程化防御方案。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;本文用于安全开发和防御体系建设。涉及真实系统的测试必须在明确授权、可恢复和可追踪的前提下进行。文章不提供针对真实目标的攻击步骤或可直接复用的绕过 payload。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="一sql-注入的本质"&gt;一、SQL 注入的本质&lt;/h2&gt;&#10;&lt;p&gt;应用程序通常会根据用户输入构造数据库查询。例如，概念上可能出现这样的逻辑：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;查询用户名为输入值的管理员记录&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果输入始终被当作“用户名”这个数据值处理，那么无论用户输入什么内容，它都不应该改变查询结构。但如果应用采用字符串拼接，输入的语义就可能从“值”变成“语法”。&lt;/p&gt;&#10;&lt;p&gt;SQL 注入成立通常同时需要三个条件：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;用户输入进入 SQL 语句。&lt;/li&gt;&#10;&lt;li&gt;输入能够影响 SQL 的语法结构。&lt;/li&gt;&#10;&lt;li&gt;应用或数据库会把执行结果、错误、状态或时间差异暴露给攻击者。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;第三个条件经常被忽略。没有可观测差异，攻击者通常难以持续判断自己的假设是否正确。因此，防御不只是阻止某个字符，而是同时收紧语法边界、数据库权限、错误输出和日志可见性。&lt;/p&gt;&#10;&lt;h2 id="二常见-sql-注入类型"&gt;二、常见 SQL 注入类型&lt;/h2&gt;&#10;&lt;p&gt;SQL 注入可以有多种分类方式。按照攻击者如何观察结果，通常可以分为以下几类。&lt;/p&gt;&#10;&lt;h3 id="1-联合查询型注入"&gt;1. 联合查询型注入&lt;/h3&gt;&#10;&lt;p&gt;部分数据库支持 &lt;code&gt;UNION&lt;/code&gt;，它可以把两条查询结果合并到同一结果集中。&lt;/p&gt;&#10;&lt;p&gt;联合查询型注入成立的前提通常包括：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;原查询结果能够返回给客户端。&lt;/li&gt;&#10;&lt;li&gt;攻击者能够推断原查询的列数和兼容的数据类型。&lt;/li&gt;&#10;&lt;li&gt;数据库用户的权限允许读取目标数据。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt;UNION&lt;/code&gt; 并不会让数据库“忽略权限”。如果数据库账号只能读取一张业务表，即便语句结构被改变，也不可能越过数据库本身的权限边界。&lt;/p&gt;&#10;&lt;p&gt;因此，防御不能只关注 &lt;code&gt;UNION&lt;/code&gt; 这个关键词，还要确保：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;应用数据库账号使用最小权限。&lt;/li&gt;&#10;&lt;li&gt;敏感表与业务读取账号隔离。&lt;/li&gt;&#10;&lt;li&gt;查询接口不暴露不必要的字段。&lt;/li&gt;&#10;&lt;li&gt;查询结果在服务端完成权限判断，而不是依赖客户端过滤。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="2-报错型注入"&gt;2. 报错型注入&lt;/h3&gt;&#10;&lt;p&gt;报错型注入依赖应用把数据库错误原样返回给客户端，或者错误信息中包含可观察的表达式结果。&lt;/p&gt;&#10;&lt;p&gt;攻击者真正利用的不是“报错”本身，而是：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;错误内容具有差异性。&lt;/li&gt;&#10;&lt;li&gt;错误内容可以被稳定复现。&lt;/li&gt;&#10;&lt;li&gt;错误内容与攻击者提交的数据存在对应关系。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;从工程角度看，生产环境应做到：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;对用户只返回统一错误码和追踪 ID。&lt;/li&gt;&#10;&lt;li&gt;将详细数据库错误写入受控日志。&lt;/li&gt;&#10;&lt;li&gt;日志中避免记录密码、令牌和完整敏感数据。&lt;/li&gt;&#10;&lt;li&gt;禁止将数据库异常直接拼接到 HTTP 响应。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;即使错误信息不再回显，也不能认为漏洞已经修复。错误隐藏只是降低信息泄漏，不能阻止注入执行。&lt;/p&gt;&#10;&lt;h3 id="3-布尔盲注"&gt;3. 布尔盲注&lt;/h3&gt;&#10;&lt;p&gt;布尔盲注利用应用状态的差异来推断条件是否成立，例如：&lt;/p&gt;</description></item><item><title>从今天开始写博客</title><link>https://linxi-blog.pages.dev/posts/hello-world/</link><pubDate>Sun, 27 Sep 2026 10:00:00 +0800</pubDate><guid>https://linxi-blog.pages.dev/posts/hello-world/</guid><description>&lt;p&gt;这是博客的第一篇文章。&lt;/p&gt;&#10;&lt;p&gt;开博客不需要等到自己「准备好」。更实际的做法是先确定一个很小的范围，然后持续记录。范围可以是一门正在学习的技能，也可以是一段项目经历，或者只是生活里值得回看的片段。&lt;/p&gt;&#10;&lt;h2 id="为什么现在开始"&gt;为什么现在开始&lt;/h2&gt;&#10;&lt;p&gt;写作会迫使自己把模糊的想法整理清楚。很多时候，我们以为已经理解了一件事，真正写下来时才会发现仍然存在空缺。&lt;/p&gt;&#10;&lt;p&gt;长期写作还有两个好处：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;文章会逐渐形成自己的知识索引。&lt;/li&gt;&#10;&lt;li&gt;过去的记录会让未来的选择更有依据。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="第一阶段的规划"&gt;第一阶段的规划&lt;/h2&gt;&#10;&lt;p&gt;先不要设计复杂的栏目。第一阶段只需要保持三件事：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;每月至少发布一篇文章。&lt;/li&gt;&#10;&lt;li&gt;每篇文章只解决一个明确的问题。&lt;/li&gt;&#10;&lt;li&gt;发布之后继续修改，而不是反复推迟发布。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="接下来"&gt;接下来&lt;/h2&gt;&#10;&lt;p&gt;这个博客会继续记录学习、项目和生活中的长期变化。内容不必完美，但需要真实、清楚，并且对自己有用。&lt;/p&gt;</description></item><item><title>如何用零成本搭建一个个人博客</title><link>https://linxi-blog.pages.dev/posts/build-a-free-blog/</link><pubDate>Sat, 26 Sep 2026 20:30:00 +0800</pubDate><guid>https://linxi-blog.pages.dev/posts/build-a-free-blog/</guid><description>&lt;p&gt;这套博客不需要购买服务器。文章使用 Markdown 编写，GitHub 保存源文件，GitHub Pages 或 Cloudflare Pages 负责免费发布。&lt;/p&gt;&#10;&lt;h2 id="整体结构"&gt;整体结构&lt;/h2&gt;&#10;&lt;p&gt;整个流程只有四部分：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Hugo 把 Markdown 转换为静态网页。&lt;/li&gt;&#10;&lt;li&gt;Git 记录每次修改。&lt;/li&gt;&#10;&lt;li&gt;GitHub 保存代码并触发自动构建。&lt;/li&gt;&#10;&lt;li&gt;免费静态托管平台提供访问地址和 HTTPS。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="本地写作"&gt;本地写作&lt;/h2&gt;&#10;&lt;p&gt;创建文章时运行：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;hugo&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;my-new&lt;/span&gt;&lt;span class="n"&gt;-post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;md&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;文章写完后，在本地检查：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;hugo&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="n"&gt;-D&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;浏览器打开 &lt;code&gt;http://localhost:1313&lt;/code&gt;。&lt;/p&gt;&#10;&lt;h2 id="发布"&gt;发布&lt;/h2&gt;&#10;&lt;p&gt;把改动提交到 GitHub 的 &lt;code&gt;main&lt;/code&gt; 分支：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;commit&lt;/span&gt; &lt;span class="n"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;publish: new post&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;push&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;仓库中的自动发布流程会把网站重新构建并部署到 Pages。&lt;/p&gt;&#10;&lt;h2 id="为什么选择静态博客"&gt;为什么选择静态博客&lt;/h2&gt;&#10;&lt;p&gt;静态博客不需要数据库，也没有复杂的运行时环境。它的文件体积小、加载速度快，安全维护成本低。对个人博客来说，这些特点通常比后台管理系统更重要。&lt;/p&gt;</description></item><item><title>博客常用 Markdown 写法</title><link>https://linxi-blog.pages.dev/posts/markdown-guide/</link><pubDate>Fri, 25 Sep 2026 09:20:00 +0800</pubDate><guid>https://linxi-blog.pages.dev/posts/markdown-guide/</guid><description>&lt;p&gt;博客正文使用 Markdown。下面这些语法已经覆盖大部分日常写作场景。&lt;/p&gt;&#10;&lt;h2 id="标题"&gt;标题&lt;/h2&gt;&#10;&lt;p&gt;使用两个井号表示二级标题，三个井号表示三级标题：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 二级标题&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;### 三级标题&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="列表"&gt;列表&lt;/h2&gt;&#10;&lt;p&gt;无序列表使用短横线：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; 第一项&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; 第二项&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;有序列表使用数字：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;1.&lt;/span&gt; 第一步&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;2.&lt;/span&gt; 第二步&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="引用"&gt;引用&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;引用适合放醒目的补充说明。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;对应写法：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;&amp;gt; &lt;/span&gt;&lt;span class="ge"&gt;引用适合放醒目的补充说明。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="代码"&gt;代码&lt;/h2&gt;&#10;&lt;p&gt;行内代码使用反引号，例如 &lt;code&gt;hugo server -D&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;多行代码需要注明语言：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Hello, blog&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="图片"&gt;图片&lt;/h2&gt;&#10;&lt;p&gt;把图片放在 &lt;code&gt;static/images/&lt;/code&gt; 目录，然后在文章中引用：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;![&lt;span class="nt"&gt;图片说明&lt;/span&gt;](&lt;span class="na"&gt;/images/example.jpg&lt;/span&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;图片文件名建议使用英文和短横线，避免空格与特殊字符。&lt;/p&gt;</description></item><item><title>关于</title><link>https://linxi-blog.pages.dev/about/</link><pubDate>Thu, 24 Sep 2026 18:00:00 +0800</pubDate><guid>https://linxi-blog.pages.dev/about/</guid><description>&lt;p&gt;这里是我的个人博客，用来记录学习、项目和生活中的长期变化。&lt;/p&gt;&#10;&lt;h2 id="关于我"&gt;关于我&lt;/h2&gt;&#10;&lt;p&gt;把这一段替换成你的自我介绍。可以写目前正在学习什么、关注哪些主题，以及希望通过博客记录什么。&lt;/p&gt;&#10;&lt;h2 id="关于本站"&gt;关于本站&lt;/h2&gt;&#10;&lt;p&gt;本站使用 Hugo 构建，文章使用 Markdown 编写，并通过 GitHub Pages 或 Cloudflare Pages 免费发布。&lt;/p&gt;&#10;&lt;p&gt;你可以通过 &lt;a href="https://linxi-blog.pages.dev/index.xml"&gt;RSS&lt;/a&gt; 订阅更新。&lt;/p&gt;</description></item><item><title>归档</title><link>https://linxi-blog.pages.dev/archive/</link><pubDate>Wed, 23 Sep 2026 12:00:00 +0800</pubDate><guid>https://linxi-blog.pages.dev/archive/</guid><description/></item><item><title>搜索</title><link>https://linxi-blog.pages.dev/search/</link><pubDate>Tue, 22 Sep 2026 12:00:00 +0800</pubDate><guid>https://linxi-blog.pages.dev/search/</guid><description/></item></channel></rss>