sql注入点
一个分号,入点一个单引号,入点一次条件判断的入点改写,就能让数据库把不该说的入点话全吐出来。sql注入点不是入点漏洞,是入点程序员的自信留下的后门。
我在一个老牌电商后台见过最典型的入点案例。登录框,入点用户名密码,入点看起来人畜无害。入点但把用户名填成 admin' --,入点密码随便打几个字,入点回车,入点管理员面板直接亮在眼前。入点那行代码大概长这样:SELECT * FROM users WHERE username='$user' AND password='$pass',入点两个变量直接拼进SQL语句,连个过滤都没做。2008年的代码,跑到2021年还在线上跑,没人敢动,因为"能跑就别碰"。
注入点本质上是信任边界崩了。程序把用户输入当成了SQL指令的一部分,而不是纯粹的数据。你输入一个字符串,它老老实实拼进查询里,结果字符串里藏着命令,数据库分不清哪些是数据哪些是逻辑,全给执行了。这种问题在拼接式SQL里几乎是必然的——只要有人偷懒用字符串拼接,迟早会出问题。
有个更隐蔽的场景。搜索功能,看起来只做模糊匹配,但如果你在参数里塞个 UNION SELECT,就能把别的表的数据拖出来。我见过一个漏洞报告,攻击者通过搜索框的注入点,把整个用户表的密码哈希全导出来了,还顺手改了管理员密码。原因就一句话:搜索词没做参数化查询,直接用 LIKE '%$keyword%' 拼进去。
不是所有注入点都那么显眼。有时候藏在HTTP头里,比如User-Agent,你以为只是记录日志,但日志系统如果直接把UA拼进SQL,那就是个隐蔽的注入点。还有Cookie,排序参数,分页参数——任何能传到后端的数据,只要跟数据库交互,都可能成为入口。判断一个地方有没有注入点,就看它有没有把输入当"可执行代码"处理。
防御手段老生常谈,但真没多少人做到位。参数化查询是正解,PDO预处理能堵死九成问题。剩下的,靠白名单校验、最小权限原则兜底。可现实是,很多老项目里,代码改起来比重构还难——业务逻辑早就跟SQL揉成一团了,没人愿意花三个月去梳理那些面条代码。
sql注入点听起来像技术名词,其实是个管理问题。它反映的是开发流程里缺少代码审查,缺少安全测试,甚至缺少最基本的"别把用户输入当代码"的常识。一个注入点背后,往往是一整个团队对安全的漠视。
最后说个讽刺的事。有些系统,安全扫描报告出来,开发一看,说"这个参数我们做了过滤",结果扫描器只测了单引号,没测编码绕过。注入点就像地鼠,你打掉一个,另一个换个姿势又冒出来。只要代码还在用字符串拼SQL,它就永远在那儿等着。









