假设你的 SQL 语句如下:
String sql = "select * from user where account_name = '" + accountName + "' and password = '" + password + "'";
我输入用户名 sdfdsf
,密码 a' or 'a' = 'a
可以得到如下的 SQL 语句:
select * from user where account_name = 'sdfdsf' and password = 'a' or 'a' = 'a'
条件一:account_name = ‘sdfdsf’ and password = ‘a’ 条件二:‘a’ = ‘a’ 上述两个条件是或者的关系。
如上例子,通过某些字符的巧妙组合,拼接出可以正常执行且有正确结果的 SQL 语句,就是 SQL 注入。采有静态 SQL 语句的地方容易出现这样的问题,而使用预编译的 SQL 则可以避免此类问题。所以我们在 Java 代码中执行 SQL 语句时建议使用 PreparedStatement 对象来执行 SQL 语句。
扩展:
SELECT * FROM USER WHERE account_name = 'zhangsan' OR account_name = 'lisi' AND PASSWORD = '234';
条件一:account_name = ‘zhangsan’ 条件二:account_name = ‘lisi’ AND PASSWORD = ‘234’
上述两个条件是或者的关系。
可以参考《SQL注入天书》。