JDBC学習の道(三)SQL注入防止,PreparedStatement探索


今登录して登录してあるいはその他の多くの地方はユーザーの入力の内容に出会って直接データベースの内部に持って行ってSQL文を実行することができて、これは1种のとても危険な运动で、あなたがユーザーが何を入力することができることを知らないため、もしユーザーはSQL文に対してとても熟知しているならば、彼は入力する时に“2つの冒号をプラスして特殊な文字として、これにより、コンピュータがSQL文のキーワードを入力したと判断してSQL文を変更し、計り知れない損失を計上することができます.このようなことを防止するコードを紹介します.
   
package com.bird.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * @use1 preparedStatement          ,       ,      
 * @use2   Statement    
 * @use3        ,        PreparedStatement    
 * @author bird
 *
 */

public class SQLInsert {//  PreStatement  SQL    
	public static void read(String num) throws Exception{
		
		Connection conn = null;
		PreparedStatement pt = null;
		ResultSet rs = null;
		try{
			conn = JdbcUtil.getConnecttion();//    
			
			String sql = "select * from niao where password = ?";//    num
			pt = conn.prepareStatement(sql);//    	
			pt.setString(1, num);
			
			rs = pt.executeQuery();//    
			
			while(rs.next()){//    
				System.out.println(rs.getObject("username")+"\t"+rs.getObject("password")+"\t"+rs.getObject("keywords")+"\t"
						+rs.getObject("userkeywords1")+"\t"+rs.getObject("time1")+"\t"+rs.getObject("userkeywords2")+"\t"
						+rs.getObject("time2")+"\t");
			}
		}finally{
			JdbcUtil.free(rs, pt, conn);
		}
		
		
	}
	
	public static void main(String [] args) throws Exception{
		read("123");
              //read("' or 2 or'");           ,        SQL      
	}
}

1.PreparedStatementはStatementから受け継がれており、Statementができることは彼ができると言える.
2.PreparedStatementは、入力したSQL文を前処理し、特殊な文字や危険を削除することができます.
文字、非常に有益で、開発者に助けを与えます
3.PreparedStatementはSQLの実行を最適化して、何度も大量のSQLクエリに対して、効率はStatementよりずっと速くて、それを使うことができることを提案して彼を使います