之前在做學生資訊管理系統和機房收費系統的時候,對于SQL注入的問題已經是司空見慣,但是并沒有真正的地形象生動的了解SQL注入到底是什麼玩意兒.直到這次做牛腩才在牛老師的舉例之下,明白了原來SQL注入是真的很危險啊.
問題提出:
我們先來構造一個簡單的添加新聞類别的程式,在動态網頁上添加一個TextBox控件,一個Button控件,一個GridView控件。布局如下圖所示:
然後為控件編寫代碼如下:
先來看SQLHelper類中用來執行sql語句的函數
然後是用來進行插入資料的函數Insert
最後是在頁面代碼中編寫按鈕的單擊事件代碼
調試沒問題之後,運作程式,結果如下圖
當我們在輸入框中輸入“奇聞異事')delete category where id=5--”之後,單擊按鈕,結果如下:
當時我看到這個結果的時候,很是震驚,就這麼輕易的把資料庫裡的資料删除了?這是為什麼呢?我們把代碼中的SQL語句提取出來,然後将輸入的内容也放進去,來分析一下原因,如下圖
這隻是SQL注入的一個簡單的例子而已,還有好多種形式的SQL注入。隻要能夠擷取你的資料庫表名(對于高手來說,這個so
easy),而且你的代碼沒有經過安全性優化,那麼我就可以随意更改甚至删除你的資料,上面的隻是删除了一條記錄,如果把語句改成delete category,那麼整個表的資料将會被清空,後果很嚴重啊。
解決方案:
一種辦法就是将輸入的内容參數化,即将原本拼接SQL語句的方式變成向SQL語句中傳入參數。具體來講,就是将Insert函數改造一下,并且将SQLHelper類中的相應函數也改寫一下,代碼如下:
先來看SQLHelper的函數如何改寫:
然後是Insert函數的優化代碼:
優化之後調試沒問題,運作程式,結果如下:
我們在輸入框中輸入“奇聞異事')delete category where id=2--”,然後單擊按鈕,會出現什麼結果呢?請看下圖:
到現在為止,相信你對SQL注入一定有了一個直覺的認識和了解,當初做系統的時候隻是知道在輸入框中輸入奇數個英文狀态下的單引号,會讓你的系統報錯甚至死掉,并不知道還可以通過拼接SQL語句對内部資料庫進行操作,進而對SQL注入的危害性沒有那麼深刻的認識,現在終于明白了原來問題很嚴重啊!