SQL 注入是指在 Web 应用程序的输入框中注入 SQL 代码,从而非法操作数据库的攻击手法。它是常年位列 OWASP Top 10 的代表性 Web 安全威胁,可能导致数据被窃取、被篡改、被删除,甚至造成服务器被完全控制。
攻击的原理很简单。例如在登录表单的用户名栏中输入 `' OR '1'='1`,后端的 SQL 查询就会变成 `SELECT * FROM users WHERE username='' OR '1'='1' AND password='...'`,由于条件恒为真,认证便可以被绕过。
防范 SQL 注入的基础,是使用预处理语句也就是参数化查询。不要把用户输入直接拼接进 SQL 字符串,而要通过占位符把它作为参数传入,这样就能防止输入值被当作 SQL 代码来解释。即使使用 ORM (Object-Relational Mapping),在书写原生 SQL 查询时也请使用预处理语句。
在短链接服务中,用户输入的 URL 和自定义别名都可能成为 SQL 注入的攻击入口。如果使用 DynamoDB 这类 NoSQL 数据库,虽然不会发生传统的 SQL 注入,但仍然存在 NoSQL 注入也就是查询条件被篡改的风险,因此输入校验依然重要。