數據庫注入的防範

數據庫注入的防範

對於一個項目來說,安全永遠是重中之重。沒有安全,信息將會泄露,應用的穩定性也堪憂。一個不安全的項目,對一個企業、組織的影響是嚴重而深遠的。輕則麻煩纏身,重則傷筋動骨,甚至瀕臨倒閉。因此安全很重要。

而數據庫注入又是近年來流行的攻擊方式,凡是大型應用,很少有不使用數據庫的,數據庫注入榮登多年OWASP10大安全漏洞榜。因此,做好數據庫注入防範十分重要。

下面是有效防範數據庫注入的方法。

1.不要手寫拼接數據庫語句

類似這樣的語句,請千萬不要出現在您的代碼之中:

username = requests.POST['username']
password = requests.POST['password']
user = User.objects.raw("select * from account_info where username = '" + username + "' and password = '" + password + "'")
if len(user) == 1:
	# ......

這十分危險,用戶的輸入沒有任何的過濾,假如用戶輸入的username是23333 or 1=1 --

那麼這條數據庫語句就變成

select * from account_info where username = '23333 or 1=1 -- ' and password = 'somthing_not_important'

這就是所謂的萬能用戶,事實上,配合盲注、報錯注入等技巧,用戶甚至可以獲得您的數據庫的所有信息,這些技巧在我的博文數據庫注入總結有總結,如果您不得已打算手寫拼接數據庫語句,請務必做好過濾,防範那篇文章內容涉及的攻擊,這是很基礎的。

不然,您可以選擇更加方便安全的方法

2.使用框架附帶的數據庫操作方法

上面危險的代碼可以改成

try:
    result = account_info.objects.get(username=tusername, password=tpassword)
except account_info.DoesNotExist:
    return dealResponse(406)

通常框架附帶的代碼,會把傳入的參數作爲語義而不是直接拼接到查詢語句上,這樣就能避免很多數據庫注入的問題。

而且上述的代碼在兼容性上也有優勢,只要修改數據庫配置文件,這份代碼就可以輕鬆複用到PostgreSQL, Oracle, SQLite, MongoDB等數據庫上。

3.使用WAF

如果還不放心,可以嘗試使用WAF,Web應用防護系統(也稱爲:網站應用級入侵防禦系統。英文:Web Application Firewall,簡稱: WAF)

這個不僅僅是防護數據庫注入的,對於其它的攻擊,例如模板攻擊、命令注入、XSS等也有防護作用。

而且,用戶輸入過濾只是WAF的一個很小的功能,WAF還提供異常檢測協議、及時補丁、基於規則的保護和基於異常的保護、狀態管理等防護技術。

WAF有硬件層面和軟件層面的,類型豐富多樣,如果您的網站有需求,它能一次性解決很多問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章