我們都知道SQL Server查詢過程中,單引號“'”是特殊字符,所以在查詢的時候要轉換成雙單引號“''”。
但這只是特殊字符的一個,在實際項目中,發現對于like操作還有以下特殊字符:下劃線“_”,百分號“%”,方括號“[]”以及尖號“^”。
其用途如下:
下劃線:用于代替一個任意字符(相當于正則表達式中的 ? )
百分號:用于代替任意數目的任意字符(相當于正則表達式中的 * )
方括號:用于轉義(事實上只有左方括號用于轉義,右方括號使用最近優先原則匹配最近的左方括號)
尖號:用于排除一些字符進行匹配(這個與正則表達式中的一樣)
以下是一些匹配的舉例,需要說明的是,只有like操作才有這些特殊字符,=操作是沒有的。
a_b... a[_]b%
a%b... a[%]b%
a[b... a[[]b%
a]b... a]b%
a[]b... a[[]]b%
a[^]b... a[[][^]]b%
a[^^]b... a[[][^][^]]b%
在實際進行處理的時候,對于=操作,我們一般只需要如此替換:
' -> ''
對于like操作,需要進行以下替換(注意順序也很重要)
[ -> [[] (這個必須是第一個替換的!!)
% -> [%] (這里%是指希望匹配的字符本身包括的%而不是專門用于匹配的通配符)
_ -> [_]
^ -> [^]
在sql語句中,有些特殊字符,是sql保留的。比如 ' [ ] 等。我們可以先看看它們的用法。
當需要查詢某數據時,加入條件語句,或著當你需要insert記錄時,我們用 ' 來將字符類型的數據引起來。比如:
Select * from Customers where City = 'London'
當表的名字或列的名字中,含有空格等一些特殊字符時,我們需要用[] 將表名引起來,告訴語法分析器,[]號內的才是一個完整的名稱。比如
Select * from [Order Details]
如果,字符數據中,含有 ' 改怎么辦呢?其實,好多人在這里并沒有處理字符川中 ' 符號,才造成sql 注射危險。就那上面的那個例子。在Sql語句拼接的時代,比如
string sql = "select * from Customers where CustomerID = '" + temp + "'";
如果,我給temp賦值為 Tom' or 1=1 ---?
那么你拼接起來的語句為 select * from Customers where CustomerID = 'Tom' or 1=1 --- '
哈哈,1=1 衡為真,---會把后面的sql語句注釋掉。而前面因為有輸入的 ' 而使的語句是合法的。那or的條件,會把所有的記錄都選出來。這就是sql注入。在做用戶登陸時,如果沒有處理該問題,那你的系統受危害的可能性會很高的。
如何處理字符數據中的 ' 符號呢? 方法很簡單,用兩個 ' 符號代替一個。 比如,其實際傳入的值為Lon'don,處理后為
Select * from Customers where City = 'Lon''don'
就可以了。
如果表或列的名稱中含有 [ 或 ] 字符呢?比如Select * from [Order] Details],那中間 ] 符號豈不是先和第一個[ 配了。后面的就是非法的了。怎么辦呢? 簡單,使用 ]] 代替 ] 。對于[,則無須處理。那就該為
Select * from [Order]] Details]。