2015-09-07 42 views
0

我使用php編寫了一個登錄頁面和一個檢查頁面。在我的本地機器上工作,但在服務器上它不工作(如果它有問題,我在Windows上,服務器在Linux上)。使用哈希進行php密碼檢查不起作用

這是在檢查頁面的代碼:

$user = $_POST['userName']; 
$pass = $_POST['pass']; 

$saltSQL = 'SELECT salt FROM agents WHERE name="' . $user . '"'; 
$saltResult = mysql_fetch_array(mysql_query($saltSQL)); 
$salt = $saltResult['salt']; 

$passToCheck = hash('sha512', $salt + $pass); 

$rowAgent = mysql_fetch_array(mysql_query('SELECT * FROM agents WHERE name ="' . strtolower($user) . '"')); 

if ($rowAgent['password'] != $passToCheck) { 
    header("location:mainLogin.php"); 
    exit; 
} 

header("location:selectamount_new.php"); 

奇怪的是,當我輸入一些字母密碼輸入系統讓我在(不管是什麼),而當我進入只是數字系統將正確地檢查密碼,不會讓我進入(將重定向到mainLogin.php而不是selectamount_new.php)。

再次在我的本地機器上工作得很好,問題是當我用Git將代碼推送到Linux機器(AWS)時。

+0

字符編碼是否在您的本地機器和服務器上相同? –

+0

SHA- *系列不適合散列密碼,因爲算法速度太快。看看函數[password_hash()](http://www.php.net/manual/en/function.password-hash.php)和[password_verify()](http://www.php.net /manual/en/function.password-verify.php)。 – martinstoeckli

+0

@martinstoeckli謝謝!但遺憾的是我目前無法使用它們,我使用PHP 5.3版本的系統工作。幸運的是,這只是暫時的,我們建立一個新的後端,並且PHP版本會更新,所以我將在未來使用它們.. – Nir

回答

4

問題出在$salt + $pass。這不是級聯,是數學運算符,如+。所以string + string = nothing,這意味着每個密碼都會匹配。 number + string = number,這就是爲什麼這個數字可以工作。你應該在這裏使用.運算符,這意味着連接。

無論如何,如果您沒有針對SQL注入的證據,任何人都可以在您的站點中登錄,無論此修復如何。

+0

謝謝,它工作!我是PHP的新手,並沒有注意到.. \:並且我正在照顧SQL注入部分,系統尚未公開.. – Nir

+0

@Nir:同時擺脫SHA-512並使用某些東西像bcrypt,scrypt或pdkdf2一樣安全。 – SilverlightFox