我正在抓取我的noob头发。无法理解为什么下面的代码不起作用。页面加载正常,但是当我尝试使用数据库中的用户名和密码登录时,页面只是通过登录表单重新加载到其原始状态,而我实际上希望看到注销按钮。我也试着比较没有盐和散列的密码与数据库中未加标签的,未加标记的等价物。不工作。密码验证不会登录,只是重新加载登录页面
我得到的唯一警告是“依靠系统的时区设置是不安全的。”,我不认为这些与密码验证功能有关。
页开始时是这样的:
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注入:
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['password']
):
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']
(同一页)。
你可以给var_dump()的$ passwordindatabase和$ password吗?检查它们是否匹配? – Bono
感谢您的评论。实际上,$ password是字符串(32)“a18c15de5dbeb62f3bb78d4212bcc3b8”,但$ passwordindatabase为NULL。显然这里有一个问题。 – Johanna
您确定您使用的用户是否存在于数据库中?另外,$ username和$ _POST ['username']是否匹配?整个mysql_fix_string()可能会造成你不想使用的东西。 **编辑**还要确保您在SQL语句中引用的表和字段是正确的。 – Bono