使用正規表示式來防止SQL注入

2021-05-06 15:57:20 字數 1495 閱讀 5206

只要幾個字元就能防sql注入——正規表示式

前天朋友的**被sql掛馬了,好慘,整個資料庫不能用了。因為裡面全是指令碼。**崩潰……

今兒他總算是把資料庫還原完事了(還好有急時備份),之後打**和我說了這事兒。忍不住建意他在所有有使用者輸入的地方進行驗證,引用一句名言:「所有輸入都是罪惡的」……

關於防注入,是很平常的話題了,最常見也最簡單的辦法,就是replace,把你不想要的字串換掉。有些asp程式設計師乾脆把這些操做做成乙個檔案,然後在頁面最上面include一下,檢查request裡所有的這欄位,樣只要有注入嫌疑,直接踢飛。.net下更容易一些,因為c#要比vbs強得多,還有.net做後盾。但我所見過的**裡,絕大多數還是靠string類裡的幾個方法來防注入。

這種方法幾呼所有人都用過,但缺點也非常明顯。那就是費事!你想去掉哪個字元,就得replace一下,有時要巢狀好幾層,搞得自己都眼花。

簡單的說一下為什麼說用替換方法來防注入不好吧。

剛才說過了,你不想要什麼字元,就得明確的把這個字元寫出來替換或是找到,然後再處理。其實這是一種「黑名單」方式,你不想誰進來,就得明確寫出是誰。黑名單方法前題是你明確的知道你想拒決誰,但事實上往往不是這樣,你也不知道哪個來了是不安全的。特別是很多程式設計師對sql技術並不了解,我本人也只是知道一點皮毛,只是夠用而以。也就是說很可能你並不知道人家會用什麼語句來注入。

「黑名單」不好,那還有別的辦法嗎?有,很明顯,它就是「白名單」。其實在計算機網中很多地方使用的安全方式都是「白名單」。像某些路由器,只有認識的ip發進來的資訊它才會**,不認識的直接否掉。如果它是以「黑名單」方式工作,那就苦了,算一下吧,天下ip位址有多少……。「白名單」方式只允許認識的人進來,不認識的直接否掉。

現在我們說到正題「正規表示式」,它正好給我們提供了一種非常方便的實現白名單方式的途徑。只需要乙個設計好的自符串,它就能幫我們確認使用者輸入的是不是捨法的資訊,而不需要你去乙個又乙個的replace。

比如我要驗證url裡get過來的id是不是合法的數值,我只需要設定乙個非常簡短的正規表示式:"^[0-9]+$ ".這個表示式要求被驗證的字串長度至少為1,並且由0到9組成,也就是說它是乙個正整數。一般我們文章頁使用的id都是乙個由自增欄位生成的整數,那麼這個正則正好能驗證它。接下來我們只要建立乙個方法,如我寫的這個:

static public bool isint(string str)

每次在有整數輸入的地方呼叫它,就可以確認使用者輸入是否合法了。就算使用者惡意輸入乙個錯誤的由整數構成的id,最多程式出錯,不可能對你造成什麼注入攻擊。

同上面方法一樣,把表示式換成:"^[0-9a-za-z_]+$ ",就可以驗證目標字串是不是乙個捨法的使用者名稱,因為組成使用者名稱的也就是這個表示式裡所指定的字元。像「  '  」、「!」、「-」和空格這樣注入攻擊中常見的字元是逃不過正規表示式的法眼的。

其實正規還可以做很多事情,本人目前也只是知道點皮毛,但發現它真的好用。其實動易等很多cms程式在模板標籤替換中都是使用的正規表示式實現的。

以上內容,有說錯和不足的地方請路過的朋友指出來,我也好改正……

其實這是寫給我那朋友看的。。 。。

正規表示式防止SQL注入

本來對正規表示式不是很了解,但由於專案需要,專案主要沒有採用儲存過程方式來儲存 sql語句,所以很有可能被黑客用sql注入攻擊,現在就在網上找了找解決辦法,在業務層來過濾sql語句,防止sql注入攻擊,主要是採用了正規表示式,因為正規表示式對字串的操作是很強大的.首先用乙個validate 類來封裝...

正規表示式防止SQL注入 C 版的

本來對正規表示式不是很了解,但由於專案需要,專案主要沒有採用儲存過程方式來儲存 sql語句,所以很有可能被黑客用sql注入攻擊,現在就在網上找了找解決辦法,在業務層來過濾sql語句,防止sql注入攻擊,主要是採用了正規表示式,因為正規表示式對字串的操作是很強大的.首先用乙個validate 類來封裝...

sql正規表示式 SQL中的正規表示式

sql正規表示式 sql中的正規表示式 sql的查詢語句中,有時會需要引進正規表示式為其複雜搜尋指定模式。下面給出一些 regexp 在mysql 語句中應用 非全部 1 匹配字串的開始部分。mysql select fo nfo regexp fo 0mysql select fofo regex...