以 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 有哪些經典入門書籍?

TAG:SQL | MySQL | SQL注入 |