提到sql注入,絕大多數程式設計師多不陌生,但是,很少有人會想到,微軟在asp.net的預設配置中,已經對敏感字元做了初步過濾。 前天學校使用考試系統進行vb考試,其中某些學生抽到的填空題的答案中包含有:a
當時出現這個問題後,讓學生進行了二次登陸,然後再提交,這樣交卷的問題就臨時解決了。考試完畢後檢視了一下出現問題的考生,發現在二次登陸的時候,系統自動將a
分析問題的原因是微軟預設的配置中,安全係數比較高,針對a
可以降低安全級別,讓這樣的輸入通過驗證。具體做法如下:
1、修改web.config中httpruntime配置節屬性,在其後新增requestvalidationmode="2.0"
2、在pages配置節中新增validaterequest="false"屬性。 (針對所有的頁面生效)
3、在相應的asp.net頁面的源中新增validaterequest="false" (針對某個頁面生效)
inherits="tgb.collegesystem.examonline.examinationsystem.exatmanonlineexam" validaterequest="false" %>
問題是解決了,但是通過這個問題,再一次拓寬了我們的思路。sql注入,程式設計師必須學會的一招。可是在出現問題前,或者說在設計程式之初,很少會意識到編譯器已經有了初步的過濾。
另外,我總結了一些防止sql注入的方法,貼出來,供大家分享。
1、 使用引數化查詢
我們都知道要盡量避免字串的拼接,但是很多人不明白為什麼引數化查詢就可以避免這個問題?
這是因為使用引數化查詢,編譯器會自動過濾掉一些敏感字元。比如如果拼接字串時用到的是乙個英文單引號,但是經過引數化查詢後就會轉變成乙個中文狀態下的,單純的字元,不會與前面的字元構成乙個不完整的sql語句。
2、 使用parameter集合
其實是用集合引數的有點與引數化查詢類似,通過集合引數物件可以自動過濾出一些敏感字元。也就是說微軟已經替我們考慮到了這一點,我們並不需要知道太多的原理,只是盡可能的是用微軟推薦的做法就行。
3、 使用儲存過程
現在一些公司統一採用儲存過程,這樣不僅可以避免一些sql注入,還可以提高效能。但是這樣做的乙個弊端是,維護人員的需要對後台資料庫熟悉。
4、 使用者輸入過濾
最簡單的過濾是合法性的輸入,如果一些正常的輸入根本用不到特殊的字元,那麼乾脆我們就將使用者的輸入限定在最小的輸入範圍內或者將特殊的字元過濾。
public static string convertsql(string str)
在很多情況下,我們無法避免使用者對一些特殊字元的輸入。這時候就需要我們用程式針對使用者輸入做詳細驗證。
public static string cleanstring(string inputstring)
} retval.replace( " ' ", " ");
} return retval.tostring();
}
解決sql注入的方法還有很多,但是「道高一尺,魔高一丈」,任何方法都有它的破綻。不過我們只要做好以下上幾個方面,一般的注入問題也足以應付了。 SQL注入(三) sql注入 bugku
原理 mysql 在使用 gbk 編碼的時候,會認為兩個字元為乙個漢字,例如 aa 5c 就是乙個 漢字 前乙個 ascii碼大於 128 才能到漢字的範圍 我們在過濾 的時候,往往利用的思 路是將 轉換為 換的函式或者思路會在每一關遇到的時候介紹 因此我們在此想辦法將 前面新增的 除掉,一般有兩種...
SQL注入 報錯注入
乙個帶get引數的 並且不從資料庫返回資料,但存在報錯資訊 檢視字段情況 報錯注入語句格式 and 1 2 union select1,2,3 from select count concat floor rand 0 2 sql語句 a from information schema.tables...
SQL注入 報錯注入
sql注入基礎 盲注 用於注入結果無回顯但錯誤資訊有輸出的情況 floor函式 返回小於等於某值的整數,例如floor 1 則返回1,floor 1.9 也返回1 rand函式 生成隨機數.可指定seed,指定後每次生成的數都一樣即偽隨機,不指定seed則每次生成的隨機數都不一樣.通過floor和r...