一.创建所需对象,并进行初始化
Connection connection=null; Statement statement=null; PreparedStatement pst; ResultSet rs=null;
二.加载mysql驱动
Class.forName("com.mysql.jdbc.Driver");
三.创建链接(url为数据库连接,root帐号,pwd密码)
connection=DriverManager.getConnection(url,root,pwd);
四.创建statement一般创建为预编形的即PreparedStatement,如果使用Statement会引起sql注入攻击,首先是一般的Statement:
statement=connection.createStatement(); String sql="select * from user where username='"+username+"'"+"and password='"+password+"'"; rs=statement.executeQuery(sql); if(rs.next()){ response.getWriter().print("connection is ok"); } else { response.getWriter().print("用户名密码错误"); }
五.测试:1.输入正确帐号="张三",密码=1234;获得效果
2.输入错误帐号=12312,密码=1231234' or '1'='1;获得效果,并将sql语句打印出来
3.总结:这句sql相当与( select * from user)一般的stament会因为sql拼接的问题,可能会被恶意攻击,攻击者可以无需帐号密码即可登录,可甚至可以删除你的数据库。
六.使用PreparedStatement防止sql注入,增强安全性,而且他比statement的效率更高,因为它是预先编译好的sql语句,使用?来代表参数,通过pst.setString方法将值传入,
第一个参数代表是第几个?的位置(从1开始),第二个参数代表是参数值。
String sql="select * from user where username=? and password=?"; pst=connection.prepareStatement(sql); pst.setString(1, username); pst.setString(2, password); System.out.println(pst.toString()); rs=pst.executeQuery(); if(rs.next()) { response.getWriter().print("connection is ok"); } else { response.getWriter().print("用户名密码错误"); }
七.测试:输入错误帐号=12312,密码=1231234' or '1'='1(sql注入方法能否正常登录)
八.总结,为什么能防止sql,看打印出来的sql语句便可以知道,预编译的语句在执行时会自动转义一些字符,从而防止sql注入