我在这里扯掉了我的菜鸟头发。无法理解为什么下面的代码不起作用。页面加载正常,但是当我尝试使用数据库中的用户名和密码登录时,页面只是使用登录表单重新加载到其原始状态,而我实际上想看到一个注销按钮。我还尝试将没有加盐和散列的密码与数据库中未加盐、未加盐的等效密码进行比较。不工作。
我收到的唯一警告是“依赖系统的时区设置是不安全的。”,我认为这些与密码验证功能没有任何关系。 p>
页面开始是这样的:
session_start();
error_reporting(-1); ini_set('display_errors', 'On');
然后是一些 HTML。然后:
if (isset($_POST['log_out'])) {
session_unset();
session_destroy();
$_SESSION = array();
}
注销按钮在按下时设置$_POST['log_out']
。然后是我从书上得到的一个函数,用来防止SQL注入(inject):
function mysql_fix_string($string) {
if (get_magic_quotes_gpc()) $string = stripslashes($string);
$string = htmlspecialchars($string, ENT_QUOTES);
$string = mysql_real_escape_string($string);
return $string;
}
然后是密码验证部分,只有在用户提交了登录表单(回发到同一页面,因此设置 $_POST['username']
和 $_POST['密码']
):
if (isset($_POST['username']) && isset($_POST['password'])) {
$salt1 = 'how';
$salt2 = 'pony';
$password = md5($salt1 . $_POST['password'] . $salt2);
$db_hostname = 'xxxxxxxxx';
$db_username = 'xxxxxxxxx';
$db_password = 'xxxxxxxxx';
$db_database = 'xxxxxxxxx';
$db_server = mysql_connect($db_hostname, $db_username, $db_password);
if (!$db_server) die("Unable to connect to MySQL: " . mysql_error());
mysql_select_db($db_database)
or die("Unable to select database: " . mysql_error());
$username = mysql_fix_string($_POST['username']);
$query = "SELECT password FROM users WHERE name = '" . $username . "'";
$result = mysql_fetch_assoc($query);
$passwordindatabase = $result['password'];
if ($password == $passwordindatabase) {
$_SESSION['logged_in'] = true;
$_SESSION['user'] = $username;
unset($_POST['username']);
unset($_POST['password']);
}
}
再往下是登录表单,仅在 if ($_SESSION['logged_in'] != true)
时显示。它将输入字段 username
和 password
的值发布到 $_SERVER['REQUEST_URI']
(同一页面)。
最佳答案
在我看来你好像错过了 mysql_query()函数,这意味着您实际上并未执行查询。
mysql_query — Send a MySQL query
执行以下操作,看看它是否有效:
$result = mysql_query($query);
$passwordindatabase = mysql_fetch_assoc($result);
编辑
换句话说,你不应该使用 mysql 函数,因为它们很老套并且有 mysql_injection 漏洞。我建议您尽快开始使用 PDO,它(如果操作正确)没有 mysql_injection 漏洞。
关于php - 密码验证不登录只是重新加载登录页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10600802/