御麗詩妃,本文**於網路,著作權歸屬原作者。sql注入都不知道怎麼有效防止,肯定不是乙個好的程式設計師
隨著web應用開發的發展,有很多的程式設計師進入到這個行業中,但是這批人的技術水平和程式設計經驗參差不齊,很多人在編寫**的時候,沒有對使用者輸入的引數進行合法性校驗,使得這成為了乙個潛在的安全隱患。如果遇到技術高手,發現這個問題,他可以提交一段資料庫查詢指令碼,獲取對自己想要的資料,這就是我們說的sql injection,即sql注入。
一 背景
某高校開發了乙個網課系統,學生需在該系統中選課並完成學習,資料庫中有一張表course,這張表存放著每個學生的選課資訊及完成情況,具體設計如下:
資料如下:
本系統中資料庫採用mysql,通過資料庫驅動jdbc對資料庫進行操作。
該系統提供了乙個功能查詢指定學生的課程完成情況的api介面,**如下。
二 注入攻擊演示
正常情況下要查詢乙個學生的選課及完成情況,我們只需要傳遞該學生對應的id即可。
這個sql指令碼很簡單,如下:
看起來好像沒有問題對吧,但是你信不信我通過這個介面可以拿到所有學生的資料,不信?要實現很簡單,只要保證這條sql指令碼where條件為真就可以了,如下指令碼:
具體怎麼做大呢?
也很簡單,我們只需要在請求該介面的時候將studendid設定為4 or 1 = 1,這樣這條sql的where條件就恆真了,sql也就等同於下面這樣
請求結果如下,我們拿到了這張表的所有資料
查詢mysql版本號,使用union拼接sql
union select1,1,version(),1
查詢資料庫名
union select1,1,database(),1
查詢mysql當前使用者的所有庫
union select1,1, (selectgroup_concat(schema_name) from information_schema.schemata) schemaname,1
通過上面的演示你有何感想?後背有沒有陣陣發涼?
這裡恐怖不僅僅是可以獲取到你的所有資料,更可怕的是他還可對你的資料庫進行更新、刪除(刪庫、刪表)等等操作。
三 如何防止sql注入
**中讓sql預編譯是最佳的防止sql注入攻擊的方案
這樣我們傳進來的引數 4 or 1 = 1就會被當作是乙個student_id,所以就不會出現sql注入了。
確認每種資料的型別,比如是數字,資料庫則必須使用int型別來儲存
規定資料長度,能在一定程度上防止sql注入
嚴格限制資料庫許可權,能最大程度減少sql注入的危害
避免直接響應一些sql異常資訊,sql發生異常後,自定義異常進行響應
御麗詩妃 Python學得好,公升職加薪下班早
御麗詩妃 本文 於網路,著作權歸宿原作者。python學得好,公升職加薪下班早 cruisejob 2020 08 13 00 00 職場中,總有些人手忙腳亂,看起來忙得飛起,實際效果慌得一批 但也有一小部分人,游刃有餘,喝著咖啡就把工作搞定了,從來不加班。同是職場中人,差距為何這麼大?真相簡單又扎...