sql注入問題


SQL注入問題想必大家都會有所聽聞,因為也許大家都聽過某某學長通過攻擊學校數據庫修改自己成績的事情,這些學長們一般用的就是SQL注入方法。SQL注入是一種非常常見的數據庫攻擊手段,SQL注入漏洞也是網絡世界中最普遍的漏洞之一。

SQL注入的發生,通常是惡意用戶通過在表單中填寫包含SQL關鍵字的數據,來使數據庫執行非常規邏輯的過程。簡單來說,就是數據庫越界做了超出代碼控制范圍的事情。這個問題的來源是,SQL數據庫的操作是通過SQL語句來執行的,而無論是執行代碼還是數據項都必須寫在SQL語句之中,這就導致如果我們在數據項中加入了某些SQL語句關鍵字(比如說SELECT、DROP等等),這些關鍵字就很可能在數據庫寫入或讀取數據時得到執行。

SQL注入的場景還原

假設有一個用戶表users,往用戶表中插入一條數據的語句是:

insert into users(name) values('yanggb');

其中的name字段來源於表單頁面中的input,這時有一個不懷好意的用戶填寫的name字段為【'yanggb');drop table users;--】,那么這時候上面的語句就變成:

insert into users(name) values('yanggb');drop table users;--);

一整行可能有點看不清楚,我們來格式化看一下:

insert into users(name) values('yanggb');
drop table users; --);

這時候,一條語句就變成了兩條語句,其中第二條語句清空了用戶表中的所有記錄。

這樣的騷操作,就是SQL注入。

防止SQL注入問題的方法

既然知道了有SQL注入的問題,也知道SQL注入問題的產生原因,就要想辦法去防止SQL注入問題了。

數據項的關鍵字檢查

先說一個最簡單的方法,也是最容易想到的。因為既然注入問題是因為執行了數據項中的SQL關鍵字,那么只需要執行SQL前檢查數據項中是否存在SQL關鍵字就好了。

實際上,很多數據庫管理系統都是采用了這種看似方便快捷的方法。但是這種方法卻並不是從根源上解決問題的方法,因為說不定上面的用戶就是喜歡叫這個名字呢。

盡量避免使用常見的數據庫名和數據庫結構

在上面的場景還原中,如果數據庫表的名稱不是叫users,而是叫uuuuuuuuusers,那么注入的代碼在執行的過程中就會報錯,也就不會發生數據丟失的情況了。

實際上,SQL注入也並不是那么簡單的,一個前提就是需要攻擊者本身對數據庫的結構有足夠的了解才能夠成功。因此在構建數據庫的時候要盡量使用較為復雜的結構和命名方式,就能有效降低被攻擊成功的概率。

使用正則表達式等字符串過濾手段限制數據項的格式

使用正則表達式等字符串過濾手段限制數據項的格式、字符數目等也是一種很好的防護措施。

理論上來說,只要避免數據項中存在引號、分號等特殊字符就能很大程度上避免SQL注入問題的發生。

使用ORM框架提供的方法

一些ORM框架提供了完善的SQL執行方案,能有效防止SQL注入問題。

總結

當然了,除了在SQL執行上的層面上預防SQL注入問題,還可以通過數據庫備份和對敏感內容進行加密來保護數據。

事實上,某些安全性問題可能永遠不會有完美的解決方案的,只有我們時刻保持警惕,並做好最基本的防護措施,才能在發生問題的時候及時反應,保證數據的最小損失。

 

"如果只是渾渾噩噩得度過每一天,十年后的今天和今天可能也不會有什么不同。"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM