php 使用散列的密码检查不起作用
php password check with hash doesn't work
我在php写了一个登录页面和一个检查页面。在我的本地机器上它可以工作,但在服务器上它不起作用(如果重要的话我在 Windows 上并且服务器在 Linux 上)。
检查页面中的代码如下:
$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) 时
问题出在 $salt + $pass
。这不是连接,是 +
运算符,就像在数学中一样。所以 string + string = nothing
,这意味着每个密码都会匹配。 number + string = number
,这就是为什么对数字有效。你应该在这里使用 .
运算符,这意味着连接。
无论如何,如果您不防止 SQL 注入,无论此修复如何,任何人都可以登录您的站点。
我在php写了一个登录页面和一个检查页面。在我的本地机器上它可以工作,但在服务器上它不起作用(如果重要的话我在 Windows 上并且服务器在 Linux 上)。
检查页面中的代码如下:
$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) 时问题出在 $salt + $pass
。这不是连接,是 +
运算符,就像在数学中一样。所以 string + string = nothing
,这意味着每个密码都会匹配。 number + string = number
,这就是为什么对数字有效。你应该在这里使用 .
运算符,这意味着连接。
无论如何,如果您不防止 SQL 注入,无论此修复如何,任何人都可以登录您的站点。