1. 程式人生 > >SQL或HQL預編譯語句,能夠防止SQL注入,但是不能處理%和_特殊字元

SQL或HQL預編譯語句,能夠防止SQL注入,但是不能處理%和_特殊字元

最近專案在做整改,將所有DAO層的直接拼接SQL字串的程式碼,轉換成使用預編譯語句的方式。個人通過寫dao層的單元測試,有以下幾點收穫。

dao層程式碼如下

//使用了預編譯sql
public List<IndvConfigModel> selectConfigBySuffix(String suffix)
{
        String hql = "from IndvConfigModel where configKey like '%'||?||'%'";

        return this.selectConfigByHQL(hql, new Object[]{suffix});
}


單元測試程式碼和執行結果如下:

@Test
public void testLike()
{
    List<IndvConfigModel> list = dao.selectConfigBySuffix("picQual");
    Assert.assertEquals(list.size(), 2);// 1.true

    list = dao.selectConfigBySuffix("picQua%");
    Assert.assertEquals(list.size(), 2);// 2.true
    
    list = dao.selectConfigBySuffix("pic'Qual");
    Assert.assertEquals(list.size(), 0);//3. true

}

1、第一個斷言是true,說明上面的做法,的確能夠起到模糊查詢的效果 
 
2、第二個斷言是true,說明%被認為是模糊匹配,並沒有被oracle看成普通的字元。這說明預編譯語句,是不能處理引數值中的特殊字元的。遇到%和_這種資料庫模糊查詢的特殊字元,需要使用者自己轉義.
 
 
3、第三個斷言沒有報異常。說明:預編譯語句已經對oracle的特殊字元單引號,進行了轉義。即將單引號視為查詢內容,而不是字串的分界符。
 
由於SQL注入其實就是藉助於特殊字元單引號,生成or 1= 1這種格式的sql。預編譯已經對單引號進行了處理,所以可以防止SQL注入