SQL注入攻击
1. 概念:用户输入时,提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的
SQL Injection,即SQL注入。
2. 原因:sql通过拼接来完成,造成非法sql,因此服务器上的数据库运行非法的 SQL 语句。
举例哈:
strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"
用户输入:
userName = "1' OR '1'='1"; 与 passWord = "1' OR '1'='1";
此时的sql会成为下面这样:
strSQL = "SELECT * FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');"
也就是实际上运行的SQL命令会变成下面这样的
strSQL = "SELECT * FROM users;"
此时就无需验证就会执行最下面的sql。
3. 解决方案之一:
1). 使用参数化查询:Java 中的 PreparedStatement 是预先编译的 SQL 语句,可以传入适当参数并且多次执行。由于没有拼接的过程,因此可以防止 SQL 注入的发生。
PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users WHERE userid=? AND password=?");
stmt.setString(1, userid);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();