最佳实践

Halo数据库的sql注入与预防

D
DBA 团队
2023年10月18日

基本介绍

SQL注入是实现数据泄露比较常见的方法之一。攻击的核心是将 SQL 命令追加到 Web 或应用程序的后端(通常通过网站),目的是破坏原始 SQL 脚本,然后执行已注入到表单域中的 SQL 脚本。在客户端应用程序中动态生成 SQL 后,最常发生此类 SQL 注入。SQL 注入攻击的根本原因在于客户端应用程序和数据库存储过程中存在的安全疏忽,且开发人员在构建新应用时未充分重视该问题。比较常见的有以下两种类型:

堆叠注入

堆叠注入是最简单方便的注入方式。只要原 SQL 语句存在结束标志(如分号 ;),且后端对一次请求中可执行的 SQL 语句数量没有限制,攻击者就能追加并执行额外的 SQL 语句。

例如:

sql
SELECT * FROM user WHERE userid = 100; SELECT version();

布尔注入

布尔是一种计算机中的基本数据类型,仅有 true 和 false 两种取值。布尔注入主要利用 length() 和 substr() 等函数,通过观察页面返回的真假状态来逐字猜解数据库信息(如版本、表名、字段名等)。

攻击过程通常分为两步:

1. 使用二分法猜测目标字符串长度,例如:

sql
AND LENGTH(version()) > 2

2. 固定位置逐字符比对,例如:

sql
AND SUBSTR(version(), 1, 1) = 'h'

攻击者可借助 Burp Suite 或 sqlmap 等工具自动化尝试 26 个字母,根据返回结果是否为 true 判断当前字符,最终结合长度信息完整还原目标字符串。

如何预防

在通过 Java 使用 JDBC 连接 Halo 数据库时,应采用预编译机制的 PreparedStatement。其核心做法是:在 SQL 语句中使用占位符 '?' 代替动态参数,并通过 setString() 等方法传入实际值。

PreparedStatement 对象会将 SQL 模板与参数分别发送给数据库服务器。数据库在执行前会对 SQL 模板进行预编译,验证语法正确性。若编译成功,则缓存执行计划并绑定参数执行;若失败则直接报错,不会执行恶意拼接的逻辑,从而有效阻断 SQL 注入。

基本原理

预编译语句 java.sql.PreparedStatement 扩展自 Statement,不仅具备 Statement 的全部功能,还提供更强的安全性和性能优势。与 Statement 不同,PreparedStatement 在创建对象时即传入完整的 SQL 模板(含 ? 占位符),数据库会立即对该模板进行预编译。这使得后续执行速度更快,尤其在重复执行或处理复杂语句时效果显著。

总结

本次介绍了 SQL 注入的基础知识及防御方式,希望大家能够理解 SQL 注入的本质,在后续开发工作中强化安全规范意识,避免对 Halo 数据库造成非法操作或数据泄露风险。


最新文章

安全公告
2025年04月11日

羲和(Halo)数据库关键补丁更新公告 - 2025年4月

安全公告
2024年06月20日

羲和(Halo)数据库关键补丁更新公告 - 2024年6月

安全公告
2023年12月18日

羲和(Halo)数据库关键补丁更新公告 - 2023年12月