温馨提示×

温馨提示×

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

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

怎样防止SQL注入

发布时间:2026-10-16 14:09:46 来源:亿速云 阅读:96 作者:小樊 栏目:数据库

防止 SQL 注入(SQL Injection)的核心原则是:永远不要把用户输入直接拼接到 SQL 语句中。下面从“原则 → 具体手段 → 开发实践”系统说明。


一、最根本的手段(最重要)

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

这是防 SQL 注入最有效、必须使用的手段。

❌ 错误写法(拼接):

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

✅ 正确写法(参数化):

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

不同语言的示例:

  • Java:PreparedStatement
  • Python:
    cursor.execute("SELECT * FROM user WHERE name = %s", (username,))
    
  • PHP(PDO):
    $stmt = $pdo->prepare("SELECT * FROM user WHERE name = ?");
    $stmt->execute([$name]);
    

✅ 原理:参数和 SQL 语句分离,数据库不会把参数当 SQL 执行。


二、ORM 框架(间接参数化)

使用成熟的 ORM 可大幅降低风险:

  • Java:MyBatis(用 #{} 而不是 ${})
  • Python:SQLAlchemy、Django ORM
  • Node.js:TypeORM、Prisma

⚠️ 注意:

  • MyBatis 中 #{} 安全,${} 危险
  • ORM 不等于绝对安全,动态 SQL 仍可能引入注入

三、输入校验与白名单

参数化是基础,输入校验是第二道防线。

1. 白名单优于黑名单

例如:

  • 排序字段只能是 id / time / name
  • 分页参数只能是数字
if (!Arrays.asList("id","time").contains(sort)) {
    sort = "id";
}

2. 类型 & 格式校验

  • 数字:强转 Integer / Long
  • 邮箱、手机号:正则校验
  • 长度限制

四、最小权限原则

数据库账号权限越小越好:

  • Web 应用不要使用 root / dba 账号
  • 只给 SELECT / INSERT / UPDATE
  • 禁止 DROP / FILE / EXECUTE

即使被注入,破坏范围也有限。


五、避免危险写法

❌ 以下方式极易导致注入:

  • 字符串拼接 SQL
  • 动态表名 / 字段名拼接(如 ORDER BY ${col})
  • 存储过程中拼接 SQL
  • 使用 eval / exec 执行 SQL

✅ 动态表名处理:

  • 用白名单映射
  • 或后端写死可选值

六、其他安全加固

  1. 关闭详细错误信息
    • 不把 SQL 错误直接返回给前端
  2. 使用 WAF(Web 应用防火墙)
    • 作为辅助手段,不是主要依赖
  3. 定期安全审计 & 渗透测试
  4. 依赖库及时升级

七、一句话总结

参数化查询 + 输入校验 + 最小权限 = 防 SQL 注入的铁三角

如果你愿意,我可以:

  • 针对某种语言(Java / Python / PHP / Node)给具体示例
  • 帮你检查一段代码是否有 SQL 注入风险
  • 讲 MyBatis / JPA 常见坑点

你可以直接把代码贴出来。

向AI问一下细节

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

AI
助
手