问题描述
在使用 PreparedStatement 之后可以解决 SQL 注入的问题, 但是其实如果字符串是 \' OR 1 = 1 OR \'
和 ' OR 1 = 1 OR '
, setString 之后的结果还是相同的, 那么这是真正的解决吗? MySQL 中的「\」也是转义的意思吗?
问题解决
MySQL 中的「\」
Java 测试代码
@Test
public void testLoginPreparedStat() throws Exception {
//原本的用户名和密码
String username = "DJ";
String password = "admin";
//如果使用SQL注入
username = "' OR 1 = 1 OR '";
password = "1";
//创建连接进行查询
Connection connection = JdbcUtil.getConnection();
String sql = "SELECT * FROM t_login_day06 WHERE username = ? AND password ?";
PreparedStatement pst = connection.prepareStatement(sql);
pst.setString(1, username);
pst.setString(2, password);
System.out.println(pst);
ResultSet resultSet = pst.executeQuery();
if (resultSet.next()) {
System.out.println("恭喜登陆成功");
} else {
System.out.println("登陆失败");
}
}
数据库内容
+----+-----------------+----------+
| id | username | password |
+----+-----------------+----------+
| 1 | DJ | admin |
| 2 | ' OR 1 = 1 OR ' | 1 |
+----+-----------------+----------+
代码执行输出
com.mysql.jdbc.JDBC4PreparedStatement@63d4e2ba: SELECT * FROM t_login_day06 WHERE username = '\' OR 1 = 1 OR \'' AND password = '1'
恭喜登陆成功
根据输出结果可以得知「\」应该是转义的意思, 因为 SQL 语句中的 \' OR 1 = 1 OR \'
等价于数据库中的 ' OR 1 = 1 OR '