2014-01-25 39 views
0

所以我有我的日誌腳本,我試圖去工作,但是當我嘗試登錄它時,總是說,即使我包含在下面的測試說預期:(密碼哈希在這裏)發現:(在這裏相同的密碼哈希)我已經改變了代碼很多次,試圖修復它,並完成了一大堆谷歌搜索(對於想給我lmgtfy鏈接的人)試圖修復它。我已經包含儘可能多的代碼,因爲我可以在無需添加虛假信息,以便堆棧溢出將讓我添加更多的代碼:php:mysqli登錄腳本失敗原因不明

實際腳本:

else{ 
    $login = login($username, $password); 
    if ($login === false) { 
     $errors[] = 'That username/password is incorrect'; 
    } else { 
     echo "ok"; 
     $_SESSION['user_id'] = $login; 
     header('Location: index2.php'); 
     exit(); 
    } 
} 
print_r($errors); 
//echo "expected to see: ". $pass. " "; //this was a test 
//echo "found: ".$passen;    //this was too 

登錄功能:

function login($username, $password){ 
$user_id = sanitize($username); 

$db = get_my_db(); 
$username = sanitize($username); 
$password = md5($password); 

$sql = "SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND   `password` = '$password'"; 

return ($db->query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `password` = '$password'") === 1) ? $user_id : false; } 

sanitize()功能只是mysqli_real_escape_string($data)如果你想要其他東西,讓我知道,我會把它放入。順便說一下,測試腳本是這樣的:預期的功能只是把$密碼變成一個MD5。

$res = $db->query("SELECT `password` FROM users WHERE username = '$username'"); 
$row = $res->fetch_assoc(); 
$pass = $row['password']; 
$passen = expected($password); 
+0

一些可能不相關的建議:1.使用準備好的語句!查找MySQLi準備好的語句或PDO。 2.不要**不再使用MD5密碼!將bcrypt或scrypt與每個用戶的鹽結合使用!最好使用PHP的內置函數:[password_hash()](http://php.net/password_hash),[password_verify()](http://php.net/password_verify)。存在PHP <5.50的兼容性庫:[ircmaxell/password_compat](https://github.com/ircmaxell/password_compat)。 – ComFreek

+0

如何定義'sanitize'? – Gumbo

+0

你確定不會跳過else語句嗎? –

回答

1

我不知道它在哪裏出現故障,但有幾個技巧:

  • 用鹽醃sha1密碼
  • 不創造這樣的sanitize(),get_my_db(功能),那些甚至不加速比你的工作
  • mysqli_$con第一個參數調用,就像mysqli_real_escape_string($con, $var);
  • 得到工作的全局$con在本地函數中,寫入function login() { global $con; }
+0

也不應該使用SHA-1。看到我上面的評論。全局變量在大多數情況下都是不好的設計。我建議創建一個DB類。 – ComFreek

+0

這是我嘗試「mysqlize」phpacademy的登錄和註冊系統。 – joeybab3