以 MySQL 為例,如何進行 SQL 注入和防止被注入?
RT,用的是php5.4+mysql。我已經用mysql_real_escape_string 將語句(內含表單數據)給轉義了 還會被注入嗎?
最好的解決方案,就是用 Prepare Statement。可以參考:
http://www.zhihu.com/question/20028410
我的回答裡面也列舉了它的各種優缺點。使用PDO 連接資料庫,進行參數綁定。
推薦閱讀《白帽子講Web安全》這本書,書中對包括防注入攻擊在內的許多web安全內容進行了討論。
MySQL為例,現在項目大部分都用框架實現,比如MyBatis框架,輕量級,功能強大:
在MyBatis中,如果寫${變數名},則為直接把傳入的值填充到SQL語句中;
如果寫#{變數名},則為傳入的值只能作為值,放到SQL語句中。
舉例:
DELETE FROM student WHERE name=${stu_name}
如果這樣寫,假如用戶惡意傳入這樣一個字元串:abc OR 1=1,那麼整個SQL就變成了
DELETE FROM student WHERE name=abc OR 1=1,結果就是全部數據都刪掉了。
這就是SQL注入,如果把${stu_name}換成#{stu_name},那麼依然傳入上面的字元串,那麼SQL是這樣的:DELETE FROM student WHERE name=`abc OR 1=1`,會刪除名字為abc OR 1=1的學生,沒有這個學生則什麼都刪除不掉,這樣就防止了SQL注入。
1、不要隨意開啟生產環境中Webserver的錯誤顯示。
2、永遠不要信任來自用戶端的變數輸入,有固定格式的變數一定要嚴格檢查對應的格式,沒有固定格式的變數需要對引號等特殊字元進行必要的過濾轉義。
3、使用預編譯(Prepare)綁定變數的SQL語句。4、做好資料庫帳號許可權管理。5、嚴格加密處理用戶的機密信息。來自 「Web安全之SQL注入攻擊技巧與防範」。
參數進行轉義與過濾比較如$id=stripslashes($id);$id=mysql_real_escap_string($id)
mysql_escap_string() mysql_real_escap_string()
防止SQL注入我知道就一點,不要拼SQL參數
白帽子講Web安全 確實講得不錯
特殊字元過濾轉義,要習慣用PDO連接資料庫操作
推薦閱讀:
※分享下你寫過的你覺得最厲害的sql語句?
※請教一下大家,關於 MySQL 百萬數據量的 count(*) 查詢如何優化?
※sql 查詢如何將結果集 輸出為一段字元串?
※沒有任何基礎的人怎麼學SQL?
※PostgreSQL 有哪些經典入門書籍?