JDBC连接mysql数据库操作

一.创建所需对象,并进行初始化

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注入

原文地址:https://www.cnblogs.com/hckblogs/p/7701184.html