MySQL查詢的安全方案
- 使用預(yù)處理語句防止SQL注入
如刪除id=1的用戶
delete from user where id=1;
# 在瀏覽器中通過get方式傳遞id值,GET ?id=1,如
user/delete?id=1 # 如果瀏覽器惡意傳值。如下
user/delete?id=1 or 1=1 # 值為1= or 1=1,現(xiàn)在的SQL語句為:
delete from user where id=1 or 1=1 # 這條語句永遠成立,這條語句會將user表的數(shù)據(jù)全部刪除
# 處理語句
delete from user where id=?; # MySQL會預(yù)先對這條語句進行結(jié)構(gòu)解析,在傳值`1 or 1=1`那么就不會再將or當(dāng)成結(jié)構(gòu)來解析了(prepare)
- 寫入數(shù)據(jù)庫的數(shù)據(jù)要進行特殊字符的轉(zhuǎn)義
- 查詢錯誤信息不要返回給用戶,將錯誤記錄到日志
PHP端盡量使用PDO對數(shù)據(jù)庫進行操作,PDO對預(yù)處理有很好的支持。MySQLi也有,但擴展性不如PDO,效率高于PDO。
延伸:MySQL的其他安全設(shè)置
- 定期做數(shù)據(jù)庫的備份
- 不給查詢用戶root權(quán)限,合理分配權(quán)限
- 關(guān)閉遠程訪問數(shù)據(jù)的權(quán)限
- 修改root口令,不用默認口令,使用比較復(fù)雜的口令
- 刪除多余的用戶
- 改變root用戶的名稱
- 限制一般用戶瀏覽其他庫
- 限制用戶對數(shù)據(jù)文件的訪問權(quán)限