1.使用MyISAM而不是InnoDB
MySQL有很多數據庫引擎,但是你最可能碰到的就是MyISAM和InnoDB。 MySQL默認使用的是MyISAM。但是,很多情況下這都是一個很糟糕的選擇,除非你在創建一個非常簡單抑或實驗性的數據庫。
外鍵約束或者事務處理對於數據完整性是非常重要的,但MyISAM都不支持這些。另外,當有一條記錄在插入或者更新時,整個數據表都被鎖定了,當使用量增加的時候這會產生非常差的運行效率。 結論很簡單:使用InnoDB。
2.使用PHP的mysql函數
PHP 自產生之日就提供了MySQL庫函數(or near as makes no difference)。很多應用仍然在使用類似mysql_connect、mysql_query、mysql_fetch_assoc等的函數,盡 管PHP手冊上說:如果你在使用MySQL v4.1.3或者更新版本,強烈推薦使用您使用mysql展。
mysqli(MySQL的加強版擴展)有以下幾個優點:
可選的面向對象接口
prepared表達式,這有利於阻止SQL注入攻擊,還能提高性能
支持更多的表達式和事務處理
另外,如果你想支持多種數據庫系統,你還可以考慮PDO。
3.沒有處理用戶輸入
這或者可以這樣說#1:永遠不要相信用戶的輸入。用服務器端的PHP驗證每個字符串,不要寄希望與JavaScript。
最簡單的SQL注入攻擊會利用如下的代碼:
$username = $_POST[''name'']; $password = $_POST[''password'']; $sql = ''SELECT userid FROM usertable WHERE username='$username' AND password='$password';''; // run query...
只要在username字段輸入“admin';--”,這樣就會被黑到,相應的SQL語句如下:
SELECT userid FROM usertable WHERE username='admin';
狡猾的黑客可以以admin登錄,他們不需要知道密碼,因爲密碼段被註釋掉了