温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么防止SQL注入漏洞产生

发布时间:2026-09-25 22:25:43 来源:亿速云 阅读:94 作者:小樊 栏目:数据库

防止 SQL 注入(SQL Injection) 的核心原则是:永远不要把用户输入直接拼接到 SQL 语句中。下面从“最推荐做法”到“辅助措施”系统说明。


一、最根本、最有效的做法(必做)

1. 使用 参数化查询(预编译语句)

这是防止 SQL 注入的首选方案。

示例(错误写法 ❌)

"SELECT * FROM user WHERE name = '" + username + "'"

正确写法(✅ 参数化)

Java(JDBC)

String sql = "SELECT * FROM user WHERE name = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, username);

Python(MySQL)

cursor.execute(
  "SELECT * FROM user WHERE name = %s",
  (username,)
)

PHP(PDO)

$stmt = $pdo->prepare("SELECT * FROM user WHERE name = ?");
$stmt->execute([$username]);

✅ 参数化后,用户输入只会被当作“数据”,不会被当作“SQL 代码”。


二、使用 ORM 框架(更安全、更省心)

ORM 会自动使用参数化查询。

常见 ORM:

  • Java:MyBatis(使用 #{})、Hibernate
  • Python:SQLAlchemy、Django ORM
  • PHP:Eloquent(Laravel)
  • Node.js:TypeORM、Prisma

⚠️ 注意:

  • MyBatis 中 #{} 安全,${} 有注入风险
  • 不要为了“方便”拼接 SQL

三、输入校验与白名单(辅助手段)

1. 白名单校验(最安全)

适用于:

  • 排序字段(ASC / DESC)
  • 表名、字段名
  • 固定选项
if (!Arrays.asList("id","name").contains(sortField)) {
    throw new IllegalArgumentException("非法字段");
}

2. 类型与格式校验

  • 数字 → 强制转 int
  • 邮箱 → 正则
  • 长度限制

四、最小权限原则(降低危害)

数据库账号应:

  • 不使用 root
  • 只给必要权限(SELECT / INSERT)
  • 禁止 DROP、FILE 等危险权限

即使发生注入,也能减少破坏范围。


五、避免危险写法(明确禁止)

❌ 以下方式 不能防注入:

  • 字符串拼接 SQL
  • 仅用 replace("'","''")
  • 仅用正则过滤
  • 前端 JS 校验(可被绕过)

六、其他安全加固

  • 关闭详细数据库错误信息(避免信息泄露)
  • 使用 Web 应用防火墙(WAF)
  • 定期做 代码审计 / 渗透测试
  • 使用安全扫描工具(如 SonarQube、Burp Suite)

总结一句话

防止 SQL 注入 = 参数化查询 + ORM + 输入白名单 + 最小权限

如果你愿意,我可以:

  • 帮你检查某段代码是否有注入风险
  • 针对 某种语言 / 框架 给具体防护示例
  • 用 攻击 vs 防御对比 讲得更直观

直接把代码或场景发我就行。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手