sql字元串過濾
『壹』 sql字元串過濾 檢測是否有危險字元
SQL字元串過濾函數:
public static bool ProcessSqlStr(string Str)
{
bool ReturnValue = true;
try
{
if (Str.Trim() != "")
{
string SqlStr = "exec|insert+|select+|delete|update|count|chr|mid|master+|truncate|char|declare|drop+|drop+table|creat+|create|*|iframe|script|";
SqlStr += "exec+|insert|delete+|update+|count(|count+|chr+|+mid(|+mid+|+master+|truncate+|char+|+char(|declare+|drop+table|creat+table";
string[] anySqlStr = SqlStr.Split('|');
foreach (string ss in anySqlStr)
{
if (Str.ToLower().IndexOf(ss) >= 0)
{
ReturnValue = false;
break;
}
}
}
}
catch
{
ReturnValue = false;
}
return ReturnValue;
}
以下是檢測SQL語句中是否包含有非法危險的字元:
/// <summary>
/// 檢測是否有Sql危險字元
/// </summary>
/// <param name="str">要判斷字元串</param>
/// <returns>判斷結果</returns>
public static bool IsSafeSqlString(string str)
{
return !Regex.IsMatch(str, @"[-|;|,|\/|\(|\)|\[|\]|\}|\{|%|@|\*|!|\']");
}
/// <summary>
/// 改正sql語句中的轉義字元
/// </summary>
public static string mashSQL(string str)
{
string str2;
if (str == null)
{
str2 = "";
}
else
{
str = str.Replace("\'", "'");
str2 = str;
}
return str2;
}
『貳』 SQL怎麼篩選出字元串中指定規則的字元
可用substring函數來查詢。
比如表中有如下數據:
現在要查詢第二位字元為「s」的數據,可用如下語句:
select * from test where substring(STR,2,1)='s'
結果截圖:
substring函數說明:
substring函數需要三個參數,其中第一個參數是要截取的字元串,第二個參數是要查詢字元串的起始位,第三個參數為截取的字元長度。
『叄』 SQL注入 當or、and等常用字元被過濾(less-25)
當常用字元被注釋無法使用時,通常採取以下方法(可自行搜索sql注入繞開過濾等):
如:Or、OR、oR等
如:通過hex、urlencode、url等編碼
舉例:如果or被過濾時,我們可以採用url編碼(其相當於把ascii編碼的0x給替換成%,比如o的ascii為0x6f,url編碼就是%6f),這個時候我們可以試試%6fr,即把o換成url編碼,也可以全換,也可以大小寫的換,如果沒被過濾就成功了,(如果%被過濾了的話…)
【註:這個可以積極的去使用,比如測試時and被注釋,使用&&替換也失敗,這個時候不妨試試%26%26(&的url編碼)】
如: /* */ (這個不止可以應對字母被注釋)
舉例:某個過濾器能夠過濾的字元如下——「select 」、」from 」、」limit 」等,注意這些字元最後面都有一個空格,這個時候我們就能通過內聯注釋來繞過這個過濾器,如:
【註:這個注釋甚至可以穿插在關鍵字當中,例如被過濾了or,我們可以把 order by 改成 o/**/rder by ,參考的資料上是這么說,但本人試了沒成功,不知是否依舊實用】
比如or被過濾了,我們可以往裡面加or,即注入:oorr,這個時候裡面的or就被刪去了,剩下的組成新字元,也就是or,是個很好用的繞過方法,像這種類似的還有很多,需要我們去思考
如:&&、||
舉例:
如盲注時經常用到比較,這時候要是比較符號被注釋了不能用平常的方法了,所以需要用某些函數如 greatest() 【 greatest(n1,n2,n3,...) 函數返回輸入參數(n1,n2,n3,...)的最大值】、least()等,比如語句: select * from users where id=1 and ascii(substr(database(),0,1))>64 就可以替換成 select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64
【註:當or被注釋時,像order by這種含有相關字元的語句也同樣無法使用,這個時候如果改變大小寫也無用時,可以使用上述的內聯注釋 /**/ ,或者用別的編碼形式,如果不行的話,那就只能放棄使用order by,可以嘗試使用group by語句等】
『肆』 SQL 過濾字元欄位值
select * from spk where isnumeric(spbh)=0
解釋:
ISNUMERIC
確定表達式是否為一個有效的數字類型。
語法
ISNUMERIC ( expression )
參數
expression
要計算的表達式。
返回類型
int
注釋
當輸入表達式得數為一個有效的整數、浮點數、money 或 decimal 類型,那麼 ISNUMERIC 返回 1;否則返回 0。返回值為 1 確保可以將 expression 轉換為上述數字類型中的一種。
『伍』 求過濾SQL非法字元的函數
Function CheckSql() '防止SQL注入
Dim sql_injdata
SQL_injdata = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"
SQL_inj = split(SQL_Injdata,"|")
If Request.QueryString<>"" Then
For Each SQL_Get In Request.QueryString
For SQL_Data=0 To Ubound(SQL_inj)
if instr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0 Then
Response.Write "<Script Language='javascript'>{alert('請不要在參數中包含非法字元!');history.back(-1)}</Script>"
Response.end
end if
next
Next
End If
If Request.Form<>"" Then
For Each Sql_Post In Request.Form
For SQL_Data=0 To Ubound(SQL_inj)
if instr(Request.Form(Sql_Post),Sql_Inj(Sql_DATA))>0 Then
Response.Write "<Script Language='javascript'>{alert('請不要在參數中包含非法字元!');history.back(-1)} </Script>"
Response.end
end if
next
next
end if
End Function
『陸』 sql 查詢語句中如何過濾指定的字元
1、語句:SELECT * FROM dbo.Procts WHERE prod_name='king doll' AND prod_price>8。
--檢索dbo.Procts表中所有列,過濾條件為由供應商king doll製造價格大於8的所有商品。
注意:--後面的字元是這條語句的注釋,這條語句有兩個條件,分別用AND關鍵字聯接在一起,並且過濾結果必須滿足這兩個條件,如果只滿足其中一個該數據不會被檢索出來。
2、OR操作符(或)
語句:SELECT * FROM dbo.Procts WHERE prod_name='king doll' OR prod_price>8。
--檢索dbo.Procts表中所有列,過濾條件為由供應商king doll製造價格大於8的所有商品值。
注意:--這里要說明的是OR操作符與AND操作符的不同之處是只要滿足其中一個條件,數值就會被檢索出來,例如:由供應商king doll製造價格小於8商品或者由供應商king add製造價格大於8的商品只要其中一個條件符合,數據就被檢索出來。
3、IN操作符(指定條件范圍)
語句:SELECT * FROM dbo.Procts WHERE prod_name IN ('king doll' ,'Queen dool')。
--檢索dbo.Procts表中所有列,過濾條件為由供應商king doll和Queen dool製造的商品。
注意:它的功能其實和OR一樣,但是它的執行速度會更快並且簡潔,最大的優點是可以包含其他SELECT語句,能夠更動態地建立WHERE字句。
『柒』 sql中篩選出一列中同時不含有某兩個字元串的語句
1、首先新建一個test資料庫,在資料庫里新建一張type表,裡面插入三條測試數據。
『捌』 如何篩選SQL字元串欄位中部分值
一、先說篩選字元串欄位中部分值的記錄。
例如我有一個KKBH(卡口編號)欄位,這是一個字典欄位(對應另一個實體表(卡口表)的編號欄位)。這個欄位的值保存所屬卡口值域{01,02,03}
本來想到的是通過or來實現,這樣需要動態生成SQL語句。
後來想到一個辦法用charindex搜索字元串的辦法。將所有的要查的卡口編號組成類似'01@02'這樣待查字元串。sql查詢時通過charindex篩選出在待查字元串里有的KKBH的記錄。
經測試使用or與使用charindex,兩者在MSSQL中執行效率差不多。
具體實現:
用戶界面查詢需求:可能搜索N個卡口的記錄(N的值域{1,所有卡口個數})。設計這個UI的形式一共三種:
一、一個多選listbox。用戶界面運行時將卡口字典表載入listbox信息。
二、兩個listbox,左邊為待選,右邊為已選,中間加兩個按鈕添加與刪除。用戶界面運行時將卡都字典表載入左邊的listbox。
三、多個Checkbox。可以在界面設計階段直接做死字典表,即有幾個卡口就話幾個checkbox。或者在程序運行根據字典表繪制動態繪制checkbox。
UI的優缺點這里不討論,我這里選擇第三種方式的動態繪制。
在查詢階段根據所選卡口生成待選字元串入:"01@02」
並將此條件傳回後台查詢服務程序
後台查詢服務里只要待查字元串作為參數傳入查詢的SQL語句中(sql片段): charindex(卡口編號,@待查字元串)。當然也可以手動生成SQL方式傳入"charindex(卡口編號,'"+待查字元串+"')".
二、模糊查詢。
使用like的模糊查詢發生效率是很低。
提高的解決辦法與:
一、用full text index 結合contains函數。全文本索引,帶了空間佔用率很高。
二、通過charindex+substring實現簡易模糊查詢。使用substring分段,charindex實現類似like '%關鍵字%'。
『玖』 防sql注入到底應過濾哪些字元
一般來說,這樣處理即可:
所有參數都當作字元串處理,用單引號括起來。另外就是要把字元串中的單引號替換掉。
『拾』 sql 查詢語句中 如何過濾 指定的字元
sqlserver:
select REPLACE(欄位名1,'湖南省','')
上面 湖南省為要替換的字元串,''為要替換的內容