如果在业务逻辑中使用了普通的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();

本文通过一个具体的例子解释了如何通过不当的SQL拼接导致SQL注入漏洞,并介绍了使用PreparedStatement来有效防止SQL注入攻击的方法。
217

被折叠的 条评论
为什么被折叠?



