SSL/SSH 能保護用戶端和伺服器端交換的資料,但 SSL/SSH
並不能保護資料庫中已有的資料。SSL 只是一個加密網路資料流的協定。
若果攻擊者取得了直接訪問資料庫的許可(繞過 web
伺服器),敏感資料就可能暴露或是被濫用,除非資料庫自己保護了這些訊息。對資料庫內的資料加密是減少這類風險的有效途徑,但是只有很少的資料庫提供這些加密功能。
對於這個問題,有一個簡單的解決辦法,就是建立自己的加密機制,然後把它用在 PHP
程式內。PHP 有幾個增加庫可以完成這個工作,比如說
Mcrypt 和
Mhash 等,它們包括多種加密運算法則。腳本在插入資料庫之前先把資料加密,以後提取出來時再解密。有關加密如何工作的例子請參考關聯手冊。
對某些真正隱蔽的資料,若果不需要以明文的形式存在(即不用顯示),可以考慮用散列算法。使用散列算法最常見的例子就是把密碼經由
MD5 加密後的散列存進資料庫來代替原來的明文密碼。參見
crypt() 和 md5()。
例子 27-1. 對密碼欄位進行散列加密
<?php
// 存儲密碼散列 $query = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');", addslashes($username), md5($password)); $result = pg_query($connection, $query);
// 傳送請求來驗證會員密碼 $query = sprintf("SELECT 1 FROM users WHERE name='%s' AND pwd='%s';", addslashes($username), md5($password)); $result = pg_query($connection, $query);
if (pg_num_rows($result) > 0) { echo 'Welcome, $username!'; } else { echo 'Authentication failed for $username.'; }
?>
|
|