sql注入漏洞
数据的CIA保护
Confidentiality:机密性指只有授权用户可以获取信息。 Integrity:完整性指信息在输入和传输的过程中,不被非法授权修改和破坏,保证数据的一致性。 Availability:可用性指保证合法用户对信息和资源的使用不会被不正当地拒绝。
三种sql语言
DML database manipulation language 数据库操作语言 select , insert , update , delete 等 当攻击者使用DML语言是,就违反了数据的保密性和完整性(update)。 DDL database definition language 数据库定义语言 攻击者使用DDL违反了数据的完整性(alert)和可用性(drop) DCL database control language 数据库操作语言 数据控制语言用于创建权限,以允许用户访问和操作数据库。 攻击者使用DCL违反了数据的 保密性(grant) 可用性(revoke)。
sql注入的实现
JDBC和sql注入
public static void main(String[] args) throws Exception { Class.forName(com.mysql.cj.jdbc.Driver); //代表外部输入的参数 String parameter = tom' union select null,null from dual'; Connection connection = DriverManager.getConnection(jdbc:mysql://localhost:3306/STOREDB, root, root); //此种方式直接拼接sql,无法防止sql注入的攻击 Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(select username,password from user where username=' + parameter + '); //使用预编译的方式, ? 是占位符,这种方式是可以防止sql注入攻击的。 PreparedStatement preparedStatement = connection.prepareStatement(select * from user where userName=?); preparedStatement.setString(1, parameter); ResultSet resultSet1 = preparedStatement.executeQuery(); }
mybatis框架和sql注入
mybatis框架的思想是将sql语句编入 到配置文件中,避免sql语句在java程序中大量出现,方便后续对sql语句的修改和配置。
正确的使用mybatis框架可以有效的防止sql注入的发生。
在mybatis中使用parameterType向sql语句传入参数,在sql引用传参可以使用#{parameter}和${parameter}两种方式
#
和$
的区别
#{ }
号会点语句进行预编译,在mybatis的debug模式下,sql语句在执行的情况下回打印使用。占位符的sql语句,这防止了sql的注入。${ }
只是进行string 替换,动态解析SQL的时候会进行变量替换