如何避免 sql 注入?

2019-09-22  

1、概念

SQL 注入(SQL Injection),是 Web 开发中最常见的一种安全漏洞。

可以用它来从数据库获取敏感信息、利用数据库的特性执行添加用户、导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。

 

2、造成 SQL 注入的原因 

程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的 SQL 脚本,程序在接收后错误的将攻击者的输入作为 SQL 语句的一部分执行,导致原始的查询逻辑被改变,执行了攻击者精心构造的恶意 SQL 语句。

 

如 从用户表根据用户名 ConstXiong 和密码 123 查用户信息

select * from user where username = 'ConstXiong' and password = '123'

恶意修改用户名参数 ConstXiong -> ConstXiong' or 1=1 --

select * from user where username = 'ConstXiong' or 1=1 --' and password = '123'

SQL 中 -- 是注释标记,如果上面这个 SQL 被执行,就可以让攻击者在不知道任何用户名和密码的情况下成功登录。

 

3、预防 SQL 注入攻击的方法

  • 严格限制 Web 应用的数据库的操作权限,给连接数据库的用户提供满足需要的最低权限,最大限度的减少注入攻击对数据库的危害
  • 校验参数的数据格式是否合法(可以使用正则或特殊字符的判断)
  • 对进入数据库的特殊字符进行转义处理,或编码转换
  • 预编译 SQL(Java 中使用 PreparedStatement),参数化查询方式,避免 SQL 拼接
  • 发布前,利用工具进行 SQL 注入检测
  • 报错信息不要包含 SQL 信息输出到 Web 页面

 

参考:避免 SQL 注入

 

ConstXiong 备案号:苏ICP备16009629号-3