第 1 篇:注入的一般形式——为什么「过滤危险字符」是错的解法

从一个查订单的接口讲起:你以为你在往句子里填一个空,实际上你在改这句话的语法结构。这一篇先让你撞上这件事,再给出覆盖 SQL、命令、模板、XSS、反序列化的统一说法,然后用能跑的代码证明「过滤危险字符」为什么方向就错了——1 OR 1=1 不含任何一个危险字符。最后给出按强度排序的三层防御,以及参数化管不到的地方。

2026-09-01 · ifcalm

第 2 篇:SQL 注入——参数化都用了,为什么还会中招

上一篇说「用参数化」。这一篇假设你已经照做了——所有查询都参数化了——然后给你三个它挡不住的场景:恶意值从你自己的数据库里来(二阶注入)、接口什么都不回显却照样被逐位读走(盲注)、以及参数化在定义上就管不到的动态列名。核心是一句话:参数化保护的是「拼接的那一点」,不是「数据的入口」。全部用 Python 标准库可复现。

2026-09-01 · ifcalm

第 3 篇:表达式语言注入——你以为在填值,其实在求值

前两篇的解析器读的是查询和命令,后果是读写数据。这一篇的解析器读的是代码本身,后果直接跳到「接管整个进程」。从一个「支持变量的通知模板」讲起,用标准库两段能跑的代码,展示同一个填值的位置怎么先变成读全局密钥、再变成执行任意代码——这就是 OGNL、SpEL、JNDI、SSTI、以及 Log4Shell 与 Struts/Equifax 共用的那台机器。

2026-09-01 · ifcalm

第 4 篇:命令注入——shell 才是那个解析器

把用户输入拼进一条 shell 命令,解析它的是 shell,而 shell 的元字符远不止一个分号。这一篇用标准库演示:分号、管道、&&、$() 各是一条独立的注入路径;给变量’加引号’为什么救不了;换成 argv 数组为什么能根治 shell 解析——以及它没能根治的那件事:参数注入。

2026-09-01 · ifcalm

第 5 篇:XSS——注入的目标是别人的浏览器

XSS 是注入的一种,只是解析器换成了受害者的浏览器、被注入的语法是 HTML/JS。这一篇用标准库证明三件事:一份 html.escape 为什么只在“HTML 文本节点”一个上下文里安全(对 javascript: 和无引号属性一个字符都改不动);用真实的 html.parser 站在浏览器那一侧看,转义过的值放进无引号属性后仍然解析出了事件处理器;以及用一个真实的 HTTP 服务器测出——URL 片段里的 payload 根本不发给服务端,所以服务端转义对 DOM 型完全够不着。

2026-09-01 · ifcalm

第 6 篇:不安全反序列化——「还原对象」本身就是执行

反序列化不是’把字节读成数据’,而是’按字节的指示重建对象’——而’重建’这一步可以携带并触发代码。这一篇用标准库 pickle 证明:一段看着只是数据的字节,loads 时就执行了代码;再用 json 对照,说明为什么换成’只能表达数据’的格式,同一个攻击就无处落脚。这是第 3 篇’填值处藏求值器’的孪生兄弟。

2026-09-01 · ifcalm

第 7 篇:密码存储——为什么快哈希是错的

W2 开篇。密码存储的每一个决定,都在为’数据库已经泄露’这个前提做准备。用标准库演示三件事:sha256 这类快哈希为什么让弱密码几乎瞬破、加盐为什么能废掉彩虹表、慢哈希为什么用’拖慢自己’来拖垮攻击者。以及一个容易忽略的收尾:比较哈希要用时序恒定比较。

2026-09-01 · ifcalm

第 8 篇:会话与令牌——签发、存储、撤销的一整条命

登录只是把’你是谁’换成一个令牌,之后每个请求都靠它。这一篇顺着令牌的一生走:生成要不可预测(random 和 secrets 的天壤之别)、登录后必须换新令牌(会话固定)、以及存储与撤销的取舍。核心是把’认证’和’会话’分开看——密码对不对是一瞬间的事,令牌有没有被人接管是往后每一个请求的事。

2026-09-01 · ifcalm

第 9 篇:JWT——签名是给谁看的

JWT 把用户信息和一个签名装进令牌自己身上,服务端不用存。但它的坑几乎都出在’签名到底验没验、用什么验’上。这一篇手写 JWT,实测三个经典误用:接受 alg=none(无签名)、算法混淆、以及最常见的——直接读 payload 不验签。核心是一句:payload 是明文,谁都能改;唯一能拦住篡改的是签名,而签名只有在你正确验证时才有意义。

2026-09-01 · ifcalm

第 10 篇:OAuth 与 MFA——把第三方和第二因子接进来

W2 收尾,讲两件把外部环节接进认证的事:用第三方登录(OAuth)和加第二因子(MFA)。OAuth 的坑集中在’回调回来的这个 code 是不是本会话发起的’——缺了 state 就是登录 CSRF。MFA 的坑在于’开了 ≠ 安全’:用一张矩阵说清短信/TOTP/推送/passkey 各自挡得住和挡不住什么,为什么只有绑定源域的 passkey 能扛住实时钓鱼。

2026-09-01 · ifcalm