未过滤用户输入导致 SQL 注入的具体防护技巧如下,仅供参考:
一、核心防护:用户输入全校验(根源防范)
所有用户输入(账号、密码、搜索关键词、接口参数等)均视为 “恶意”,必须先过滤、再使用:
- 过滤危险内容:移除 / 转义单引号、双引号、分号、SQL 关键字(OR、AND、SELECT、DELETE 等)及特殊符号(<、>、#),避免恶意输入被解析为 SQL 语句。
- 限制输入规则:明确输入长度(如用户名 6-20 位)、格式(如手机号 11 位),超出范围直接拦截;指定输入类型(如用户 ID 仅允许数字),非对应类型直接拒绝。
二、关键操作:禁用 SQL 拼接,使用参数化查询(最有效手段)
杜绝 “固定 SQL 片段 + 用户输入” 的拼接方式,采用各语言支持的参数化查询 / 预编译,从技术上阻断注入可能:
- Java 开发:使用 JDBC 的 PreparedStatement,或 MyBatis 的 #{}(禁用 ${}),示例:
select * from user where username = ? and password = ?,通过 setString () 设置参数。 - Python 开发:使用 PyMySQL 的 % s 占位符做参数化查询,或 SQLAlchemy 的 ORM 框架,禁止字符串拼接。
- PHP 开发:使用 PDO 的 prepare 语句,或 mysqli 的参数绑定,杜绝直接拼接 SQL。
三、辅助防护:降低攻击危害(兜底保障)
即使做好前两步,仍需补充防护,避免漏洞被利用后造成毁灭性损失:
- 最小权限原则:业务代码连接数据库时,使用普通账号,仅授予查询、插入、更新等必要权限,禁止 root、sa 等超级账号。
- 隐藏报错信息:生产环境不返回详细 SQL 报错(如 “表不存在”),统一提示 “操作失败,请稍后重试”,避免攻击者猜测数据库结构。
- 定期漏洞扫描:用 OWASP ZAP、SonarQube 等工具,定期扫描代码注入漏洞,及时修复;定期更新数据库及依赖包,修补系统漏洞。