防止SQL注入的方式

原文地址:https://www.jianshu.com/p/09cf541ed13f

什麼是sql注入:

    原文地址:https://blog.csdn.net/u014590757/article/details/79637015


防止sql注入:

1,第一種採用預編譯語句集,它內置了處理SQL注入的能力,只要使用它的setString方法傳值即可:

String sql= "select * from users where username=? and password=?;"

PreparedStatement preState = conn.prepareStatement(sql);

preState.setString(1, userName);

preState.setString(2, password);

ResultSet rs = preState.executeQuery();

...

    2,第二種是採用正則表達式將包含有 單引號('),分號(;) 和 註釋符號(--)的語句給替換掉來防止SQL注入       

public static String TransactSQLInjection(String str){

       return str.replaceAll(".*([';]+|(--)+).*", " ");

}

userName=TransactSQLInjection(userName);

password=TransactSQLInjection(password);

String sql="select * from users where username='"+userName+"' and password='"+password+"' "

Statement sta = conn.createStatement();

ResultSet rs = sta.executeQuery(sql);

3,使用Hibernate框架的SQL注入防範Hibernate是目前使用最多的ORM框架,在JavaWeb開發中,很多時候不直接使用JDBC,而使用Hibernate來提高開發效率。在Hibernate中,仍然不應該通過拼接HQL的方式,而應使用參數化的方式來防範SQL注入。有兩種方式, 一種仍然是使用JDBC一樣的佔位符“?”,但更好的方式是使用Hibernate的命名參數,例如檢測用戶名和密碼是否確,使用Hibernate可以寫成:

String queryStr = “from user where username=:username ”+”password=:password”;

List result = session.createQuery(queryStr).setString("username",

            username).setString("password", password).list();

 4,字符串過濾

        比較通用的一個方法:(||之間的參數可以根據自己程序的需要添加)     

public static boolean sql_inj(String str){

            String inj_str = "'|and|exec|insert|select|delete|update|           

            count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";

            String inj_stra[] = split(inj_str,"|");

            for (int i=0 ; i < inj_stra.length ; i++ ){

            if (str.indexOf(inj_stra[i])>=0){

            return true;



            }           

        }         

            return false;         

    }

    5,JSP頁面判斷代碼

        使用javascript在客戶端進行不安全字符屏蔽

        功能介紹:檢查是否含有”‘”,”\\”,”/”

        參數說明:要檢查的字符串

        返回值:0:是1:不是

        函數名是      

function check(a){

    return 1;       

    fibdn = new Array (”‘” ,”\\”,”/”);       

    i=fibdn.length; 

    j=a.length;   

    for (ii=0; ii<i; ii++){ 
        for (jj=0; jj<j; jj++) { 
            temp1=a.charAt(jj);

            temp2=fibdn[ii];

            if (tem'; p1==temp2)

            { return 0; }

        }

    }

    return 1;
}

    在編寫MyBatis的映射語句時,儘量採用#{xxx}這樣的格式。若不得不使用${xxx}這樣的參數,要手工地做好過濾工作,來防止SQL注入攻擊。

    #{}:相當於JDBC中的PreparedStatement

    ${}:是輸出變量的值

    簡單說,#{}是經過預編譯的,是安全的;${}是未經過預編譯的,僅僅是取變量的值,是非安全的,存在SQL注入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章