再次尋求一些有關PHP安全性和登錄系統的幫助。想知道我是否在這裏正確做到了這一點。如果我沒有足夠的具體足夠的地方請詢問,任何幫助非常感謝。我正在嘗試創建一個安全的登錄系統,僅用於學習目的。這裏是代碼:這是否使用PDO並準備好了用於安全登錄的語句?
require("constants.php");
$DBH = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
function createSalt() {
$length = mt_rand(64, 128);
$salt = '';
for ($i = 0; $i < $length; $i++) {
$salt .= chr(mt_rand(33, 255));
}
return $salt;
}
//Salt function created by ircmaxell
function registerNewUser() {
//Check to see if Username Is In Use//
$q = $DBH->prepare("SELECT id FROM users WHERE username = ?");
$username = filter_var($username, FILTER_SANITIZE_STRING);
$data = array($username);
$q->execute($data);
$row = $q->fetch();
if ($row === false) {
//If Username Is Not Already In Use Insert Data//
$hash = hash('sha256', $pass);
$salt = createSalt();
$hash = hash('sha256', $salt . $hash . $pass); //UPDATED
$data = array($username, $hash, $salt);
$qInsert = $DBH->prepare(
"INSERT INTO users (username, password, salt) values (?, ?, ?)"
);
$qInsert->execute($data); //Inserts User Data Into Table//
}
}
搜索PHP.net, t找到一個名爲「canonicalize()」的函數這是一個用戶定義函數沒有包含在代碼中? – 2010-12-15 19:12:07
另外,bind_param()以「i」作爲變量被調用,但是「i」沒有在您準備好的語句中定義。您可以將用戶名變量作爲單個成員數組傳遞給execute語句並跳過bind_param()。 – 2010-12-15 19:16:42
是的,我看到canonicalize()不是一個函數,我以爲我讀過它是一個函數。可能不會。謝謝,至於變量,也謝謝你。我編輯它。謝謝您的幫助! – mcbeav 2010-12-15 19:44:23