不少朋友都會寫SQL語句,如果你還不會寫,可以看看果果以前寫的文章「學學寫點SQL語句,好嗎?」,可是你造嗎,SQL注入攻擊是Web開發中最常見的一種安全問題,惡意攻擊者可以利用它來獲取數據庫中的敏感信息、篡改數據,甚至可以獲得系統的控制權限。產生SQL注入漏洞的原因也很簡單,就是開發者沒有對用戶提交的內容進行過濾,導致了惡意SQL語句的執行。
我們來看個簡單的栗子,假設有一個登錄系統,用戶在登錄時提交用戶名和密碼,如果通過用戶名和密碼能從后臺數據庫中找到某個用戶,那么就算登錄成功了。可以寫出這樣的代碼:
username = req.POST['username']
password = req.POST['password']
sql = "SELECT * FROM user_table WHERE username='" + username + "' AND password='" + password + "'"
可以看出,這個SQL語句是將查詢語句和用戶提交的數據拼接起來的,如果我提交的用戶名是 guoguo ,密碼是 passwd123 ,那么這個SQL語句就是:
SELECT * FROM user_table WHERE username=' guoguo ' AND password=' passwd123 '
這樣看上去很正常對吧?可是,如果我是個壞人,提交的數據是這樣的,用戶名填的是 guoguo' -- ,密碼是 123 ,那么在后臺得到的SQL語句就變成這樣的了:
SELECT * FROM user_table WHERE username=' guoguo ' --' AND password='123'
這里就有點蹊蹺了哦,我們先看前面那個SQL語句,必須是賬號密碼兩個條件匹配上了,才會返回guoguo這個用戶的信息,否則查詢不到任何結果。再看第二個SQL語句,--在SQL語句中是注釋符號,它后面的語句都將被無視,那么這個語句翻譯成白話就是“把用戶名是guoguo的用戶給我找出來”,看見沒?這樣完全不需要知道密碼,就能拿到guoguo的用戶信息,繼而登錄guoguo的賬戶。
這種通過在提交數據里面寫入SQL代碼,巧妙改變后臺SQL執行邏輯的攻擊方式,就是SQL注入攻擊。
如何防范SQL注入攻擊呢?其實也很簡單,在這個栗子中,我們將用戶輸入的數據進行過濾,只允許使用字母和數字,那么這個攻擊就起不到任何作用了。
當然了,你也可以寫更復雜的過濾規則,不過 我們只需要記住一個原則就行了,永遠不要相信外界輸入的數據。現在掃描SQL注入的工具也有很多,上線前,多用安全工具掃一掃,防范有疏漏喔~
云恒網絡www.xyzqw.net版權所有 備案號:魯ICP備19021997號-1 淄博高端網站建設、網絡營銷知名品牌 網絡整合傳播機構