如果在业务逻辑中使用了普通的sql拼接方法来查询用户名和密码的话
如果没有在输入加上一些限制,那么就可能被有心之人利用,在sql中拼接上一些语句,然后程序会识别并执行这些语句,从而造成数据库数据泄漏
"select * from Account where username ='"+username+"'"
例如这个语句,如果变量username的值为普通的正常的查询,那么一般就不会出什么问题
例如username=“Jack”
那么拼接后的sql就是
"select * from Account where username ='jack'"
然后就可以执行正常的功能了。
但是要注意,这个sql语句可以通过username变量输入任何的字符串,拼接成sql语句之后可能出现一些意想不到的结果。
例如username=“jack ’ or’*”
那么拼接后的sql语句就是
"select * from Account where username ='jack' OR '*'"
这个sql语句就可以查询出Account表中所有的username;
解决的方法就是使用PrepareStatement来防止注入
PrepareStatement
-
首先创建一个PrepareStatement的空指针
PrepareStatement pst=null;
-
创建一个sql语句,要插入的变量使用?来进行站位,例如在我这个sql语句中两个变量先用?来代替
sql=“select * from Account where username=? and password=?”;
-
然后利用Connection对象来创建PrepareStatement对象
pst=conn.prepareStatement(sql);
-
使用PrepareStatement对象的方法来对sql中缺省的? 进行补全。
pst.setString(1,username); pst.setString(2,password);
-
最后执行这个PrepareStatement对象,注意这里的executeQuery方法中没有填参数
rs = pst.executeQuery();