sql注入例子,假設db中存在如下資料:
+----+---------+----------+
| id | uid | password |
+----+---------+----------+
| 1 | forrest | abc |
| 3 | denny | abc |
| 5 | peggy | abc |
| 6 | vivian | abc |
+----+---------+----------+
正常query語句:select * from user where uid='vivian' and password='abc';
使用者名稱框注入:'123' or '1'='1',密碼框輸入:'abc' --> sql語句變為:select * from user where (uid='123' or '1'='1') and (password='abc');
可查詢到所有密碼為abc的使用者,並登陸成功。
密碼框注入:'123' or '1'='1',使用者名稱框輸入:'vivian' --> sql語句變為:select * from user where (uid='vivian' and password='123') or ('1'='1');
可查詢到所有使用者,並登陸成功。
使用者名稱框注入:'123' or '1'='1',密碼框注入:'123' or '1'='1' --> sql語句變為:select * from user where [(uid='123' or '1'='1') and password='123'] or '1'='1';
可查詢到所有使用者,並登陸成功(可以看出結果和只在密碼框中注入sql的結果是一樣的)。
上面中的()是為了給sql斷句,以便理解(這樣就應該很好理解了吧,乙個很簡單的邏輯哦,我就不解釋了)。實際應用中並無此類括號。
ps:如果知道了db中某table的tablename。則可以對其進行破壞,eg密碼框注入:'123'; drop table tb_name; --> 真的很髮指啊!!!
1、preparedstatement
2.1、檢測sql meta-characters的正規表示式 /(\%27)|(\')|(\-\-)|(\%23)|(#)/ix
2.2、修正檢測sql meta-characters的正規表示式 /((\%3d)|(=))[^\n]*((\%27)|(\')|(\-\-)|(\%3b)|(:))/i
2.3、典型的sql注入攻擊的正規表示式 /\w*((\%27)|(\'))((\%6f)|o|(\%4f))((\%72)|r|(\%52))/ix
2.4、檢測sql注入,union查詢關鍵字的正規表示式 /((\%27)|(\'))union/ix(\%27)|(\') - 單引號和它的hex等值union - union關鍵字。
2.5、檢測ms sql server sql注入攻擊的正規表示式 /exec(\s|\+)+(s|x)p\w+/ix
4、filter過濾
public static string filtercontent(string content){
string flt ="'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
string filter = flt.split("|");
for(int i=0;i5、 避免動態sql
動態sql是動態查詢的很好的工具,但這也會暴露脆弱點。很多情況下可以使用其他sql語句或儲存過程來代替動態sql。當然,如果您在儲存過程中依然通過使用者輸入來建立動態sql查詢,那麼只靠替換還是不安全的。
6、最低許可權原則
永遠也不要在**中用管理員級別許可權的帳戶來連線資料庫。應用程式使用的帳戶應該只擁有應用程式需要的最低級別的許可權。這也能將已入侵者造成的破壞降低到最低限度。應用程式不能已sa或其他管理員帳號連線資料庫,而且應定義使用的帳號能訪問的範圍。
7. 安全儲存機密資訊
不要用明文儲存機密資訊。較好的替代方法是使用加密或雜湊密碼。雜湊密碼較加密密碼更安全,這是因為它們不能被解密。你還可以在雜湊加密之前新增一些隨機值來增加安全性。
8. 只有知道如何注入,才能更有效的防注。乙個例子
加個',如果沒過濾特殊字元,網頁一定出錯,就是看怎麼出錯法。畫面能顯示一部分,一部分提示資料庫出錯,找不到什麼什麼,最有希望注入。
?id=1'
下一步,試試 and 1=1 ,如果畫面不出錯,1=1是成立的,有希望了。
?id=1 and 1=1
下一步,試試 and 1=2 ,如果畫面出錯,1=2是不成立的,可以肯定這個位址可以注入。
?id=1 and 1=2
好戲來了:
?id=1 and (select * from admin)>0
不出錯,證明資料庫有admin這個表。
?id=1 and (select username from admin)>0
不出錯,證明資料庫的admin有username這個字段。
?id=1 and len(select top 1 username from admin)>5
不出錯,證明資料庫的admin的第乙個username長度》5。
後面的自己測試……本文的目的僅用於各位站長檢測自己的站有沒有sql注入漏洞。
SQL注入(三) sql注入 bugku
原理 mysql 在使用 gbk 編碼的時候,會認為兩個字元為乙個漢字,例如 aa 5c 就是乙個 漢字 前乙個 ascii碼大於 128 才能到漢字的範圍 我們在過濾 的時候,往往利用的思 路是將 轉換為 換的函式或者思路會在每一關遇到的時候介紹 因此我們在此想辦法將 前面新增的 除掉,一般有兩種...
sql注入的解釋和防範及注意方式
sql注入,是利用web程式的請求,構建特殊的輸入引數,將惡意的sql語句注入到後台資料庫引擎中,最終可以欺騙伺服器執行惡意sql。1 分級管理 通過許可權,限制使用者行為,禁止給予資料庫建立 刪除 修改等相關許可權 2 引數傳值 資料輸入不能直接嵌入到查詢語句中。同時要過濾輸入的內容,過濾掉不安全...
SQL注入 報錯注入
乙個帶get引數的 並且不從資料庫返回資料,但存在報錯資訊 檢視字段情況 報錯注入語句格式 and 1 2 union select1,2,3 from select count concat floor rand 0 2 sql語句 a from information schema.tables...