2013-05-02 73 views
-3

我查了好幾篇關於保持安全數據庫的教程,但我仍然不知道我需要採取什麼措施來保護我的數據庫免受SQL注入和黑客攻擊。我需要什麼來保持安全的MySQL數據庫?

這是我一直用來清除任何用戶輸入的函數,但我覺得這不是全部,它可以忽略哪些其他的東西?

function CleanInput($value) { 
    stripslashes($value); 
    if(!is_numeric($value)) { 
     mysql_real_escape_string($value); 
    } 
    return $value; 
} 
+1

'mysql_real_escape_string' is [deprecated。](http://php.net/manual/en/function.mysql-real-escape-string.php) – 2013-05-02 21:20:26

+0

步驟1,請勿使用棄用的函數。 – 2013-05-02 21:21:16

+0

第2步。閱讀關於mysqli http://php.net/manual/en/book.mysqli.php – 2013-05-02 21:23:15

回答

-1

這不是一個糟糕的開局,但這裏的一些真正有用的信息的鏈接:

http://simon.net.nz/articles/protecting-mysql-sql-injection-attacks-using-php/

最好的解決辦法?使用綁定參數。要使用這些,您需要使用PHP5附帶的改進的mysqli庫。這種技術在稍有不同定義查詢「模板」先用佔位符,然後在「綁定」的參數給它,並和mysqli庫負責相應的轉義爲我們:

$query = $mysqli->prepare("UPDATE tablename SET favorite_color = ?, age = ?, description = ? WHERE user = ?"); 
// we would have a bind looking like this: 
$query->bind_param('sibs', 'red', 27, $some_blob, $variable); 
$query->execute(); 
+0

謝謝你這個偉大的作品,我感謝你的幫助! – user2344616 2013-05-02 21:36:30

+0

我的榮幸,至少你是在負責任地採取安全措施! – Chris 2013-05-02 21:37:36

0
  1. 讓您的服務器的安全。你服務器上的某個人很大,不是很明顯。
  2. 只有在絕對必要時才允許遠程訪問數據庫。
  3. 擁有強大的MySQL登錄密碼。
  4. 將PHP腳本正在使用的用戶限制爲所需權限的絕對最小值。例如,給腳本只讀權限。
  5. 要防止SQL注入,請使用PHP PDO或MySQLi代替傳統的MySQL函數。
  6. 不要相信你的用戶。
0

最佳做法是使用prepared statements

使用使用mysql_query也是不好的做法,因爲它已被棄用,如果您檢查文檔可以看到。

使用mysql_real_escape_string也是一種不好的做法,因爲它也過時了,我建議使用PDOmysqli,這兩個實現的支持預處理語句它不能從logical sql injections

救你。

準備好的語句可以避免黑客將命令插入到系統中,從而導致注入,但是它會爲常量創建一個模板,這不會影響數據庫。這對性能也有好處。

驗證所有輸入,客戶端和服務器端也是明智之舉。

0

首先,安全的mySQL沒有靈丹妙藥。 你必須詳細說明一點。 如果您有興趣登錄以及如何避免大部分(如果不是全部)SQL注入技巧等,那麼 在mySQL中使用存儲過程。我不認爲PHP會給你所有的可能。 例如,假設您不是連接到實際/生產數據庫,而是連接到另一個數據庫,而您的用戶只能訪問存儲過程(對PHP更好)。 然後,沒有人可以看到你的數據在這個DB!即使他知道你的db-name,username和passwd,他也無法從任何表中選擇SELECT。 使用存儲過程,您可以提交(再次選擇)用戶的用戶名和密碼,並且您會收到一個新的db-name,主機,用戶名和密碼,再次連接它以檢索您的真實數據。

如果您對性能或mySQL過載不太在意,可以使用與數據庫連接相同的技巧。

-1

在工作的後端(數據庫,MySQL等)和前端(php等)使用MD5函數來獲取密碼。

非常簡單,但一個良好的開始,以確保您的工作。

我的教授稱讚我把它包括到我的項目中。