跳转到主要内容

SQL 注入

本文约需 2 分钟阅读

SQL 注入 (SQL Injection) 是指向 Web 应用程序的输入表单等注入恶意 SQL 语句,从而非法操控数据库的攻击手法。它是一种极其危险的漏洞,可能导致绕过认证、窃取、篡改或删除数据,甚至夺取服务器的控制权。它在 OWASP Top 10 中长年位居前列, 2024 年注入攻击仍被列为主要威胁类别。

仅检查输入无法封闭该漏洞的原因

该漏洞的成因并不在于输入的文字中含有危险符号,而在于仍然存在把外部接收到的值当作命令的一部分来解释的路径。成因这样界定之后,处理的方向也随之改变。去除被视为危险的符号,或拒绝含有特定词语的输入,这类做法会变成维护一份应当拾取对象清单的工作。然而清单上应当收录什么,会随所用数据库的种类和语句的写法而变化,同样的含义有时也可以用另一种写法表达。另一方面,含有符号的输入在日常业务中同样会出现。姓名、地址和搜索用词中都会出现符号,因此把拒绝的范围放宽,正当的输入就无法通过;把范围收窄,则留下了通过的余地。这种调整无法偏向任何一端,关于把边界置于何处的判断也会持续存在。若改用绝不把值作为命令的一部分传递、只能将其当作值来处理的机制,这项边界判断本身就不再需要。在实务中造成困扰的另一点是修改的单位。当在某一个画面上得到确认时,同样的组装写法往往也排列在其他画面之中,因为为某个功能写下的写法,会在构建类似功能时被参照。因此,修好被发现的那个画面,仍会让保留同样写法的路径处于同样的状态。应当计数的不是被指出的画面数量,而是组装值的写法有多少种,以及每一种分别在多少处被使用。

SQL 注入的流程

输入恶意 SQL
服务器执行 SQL
从数据库非法获取数据
信息泄露 / 篡改

攻击的原理

将用户输入直接拼入 SQL 语句的程序会成为攻击目标。例如,在登录表单中输入「' OR 1=1 --」即可绕过认证,或使用 UNION 子句获取其他表的数据。在盲注 (Blind SQL Injection) 中,即使不显示错误消息,也能根据真假值的差异推测数据。

具体的受害情景

一种常见的误解是「SQL 注入是一种过时的攻击手法,现代系统中不会发生」。实际上,即使在改造遗留系统或新开发的过程中,仍然会发现不使用参数化查询、而通过字符串拼接构建 SQL 的代码。 2024 年也有报告称,某大型企业的数据库通过 SQL 注入泄露了数百万条客户信息。由于攻击者会使用自动化工具 (如 sqlmap) 高效地搜寻存在漏洞的网站,因此即便是小型网站也会成为目标。

作为用户的防范

SQL 注入是服务器端的漏洞,但作为用户也需要做好防范。如果为每项服务设置独立的随机密码,那么即使某一项服务发生数据泄露,其他账户也仍然安全。如果你使用的服务公布了数据泄露,请尽快更改密码。

相关术语

这篇文章对您有帮助吗?