在敲机房收费系统的时候,就曾经遇到过SQL注入的问题,也写过一篇博客。而在学习java的过程中,有一次遇到了,不错的是,JDBC为我们提供了一个PreparementStatement接口,可以防止SQL的注入,下面介绍一下。


  1.SQL注入问题

在以前过程中,总是采取拼接SQL语句的方式,来实现数据的增删改查!

String Sql=select * from user where username="" and password=""

由于没有对拼接的字符进行检查,很容易遭受到恶意的攻击,例如变成如下操作。

select * from user where username='老李' or '1'='1' and password=";

        由此及产生了SQL注入的问题。


  2.Preparement

PreparedStatement 解决SQL注入原理,运行在SQL中参数以?占位符的方式表示

select * from user where username = ? andpassword = ? ;

将带有?的SQL 发送给数据库完成编译(不能执行的SQL 带有?的SQL 进行编译 叫做预编译),在SQL编译后发现缺少两个参数

PreparedStatement 可以将? 代替参数发送给数据库服务器,因为SQL已经编译过,参数中特殊字符不会当做特殊字符编译,无法达到SQL注入的目的

                      主要是采取预编译

  3.Demo演示

  1. <span style="font-family:SimSun;font-size:18px;"><strong>// 使用PreparedStatement来解决登录操作,可以解决sql注入  
  2.     public User findUserByUserNameAndPassword(String username, String password) {  
  3.   
  4.         String sql = "select * from user where username=? and password=?";  
  5.   
  6.         Connection con = null;  
  7.         PreparedStatement pst = null;  
  8.         ResultSet rs = null;  
  9.         try {  
  10.             // 1.得到连接对象  
  11.             con = JdbcUtils.getConnection();  
  12.   
  13.             // 2.获取操作sql语句对象  
  14.             pst = con.prepareStatement(sql); // 将sql语句进行预加载.  
  15.   
  16.             // 需要对占位符进行传参数  
  17.             pst.setString(1, username);  
  18.             pst.setString(2, password);  
  19.   
  20.             // 3.操作sql语句  
  21.             rs = pst.executeQuery();// 注意无参数  
  22.   
  23.             // 4.操作结果集  
  24.             if (rs.next()) {  
  25.                 User user = new User();  
  26.                 user.setId(rs.getInt("id"));  
  27.                 user.setUsername(rs.getString("username"));  
  28.                 user.setPassword(rs.getString("password"));  
  29.                 return user;  
  30.             }  
  31.         } catch (ClassNotFoundException e) {  
  32.             e.printStackTrace();  
  33.         } catch (SQLException e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.   
  37.         return null;  
  38.     }</strong></span>  


  


  4.批处理操作

另外PreparementStatement还支持批量SQL语句的操作,有兴趣的可以查一下相关的API,主要方法如下

addBatch(); 添加sql到批处理

executeBatch();执行批处理





  5.Demo演示

  1. //PreparedStatement批处理  
  2. public class PreparedStatementBatchTest {  
  3.   
  4.     public static void main(String[] args) throws ClassNotFoundException,  
  5.             SQLException {  
  6.   
  7.         String sql = "insert into user values(?,?)";  
  8.         // 1.得到Connection  
  9.         Connection con = JdbcUtils.getConnection();  
  10.   
  11.         // 2.得到PreparedStatement 对象  
  12.         PreparedStatement pst = con.prepareStatement(sql);  
  13.   
  14.         // 3.执行批处理  
  15.         long l1=System.currentTimeMillis();  
  16.         for (int i = 1; i <= 10000; i++) {  
  17.   
  18.             pst.setInt(1, i);  
  19.             pst.setString(2"name" + i);  
  20.   
  21.             pst.addBatch(); //添加批处理  
  22.               
  23.             if(i%1000==0){  
  24.                 pst.executeBatch();  
  25.                 pst.clearBatch(); //清空批处理语句.  
  26.             }  
  27.         }  
  28.           
  29.         System.out.println(System.currentTimeMillis()-l1);  
  30.           
  31.         pst.executeBatch();  
  32.           
  33.         //4.关闭资源  
  34.         pst.close();  
  35.         con.close();  
  36.     }  

网友评论

更多精彩分享

游戏论坛模拟-Java培训机构,青岛Java培训,青岛计算机培训,软件编程培训,seo优化培训,网络推广培训,网络营销培训,SEM培训,网络优化,在线营销培训,Java培训游戏论坛模拟