我在这里扯掉我的菜鸟头发。无法理解为什么下面的代码不起作用。页面加载正常,但是当我尝试使用数据库中的用户名和密码登录时,页面只是使用登录表单重新加载到其原始状态,而我实际上希望看到一个注销按钮。我还尝试将没有盐和散列的密码与数据库中未散列的、未加盐的等效项进行比较。不工作。
我得到的唯一警告是“依赖系统的时区设置是不安全的”。,而且我认为这些与密码验证功能没有任何关系。
页面开始是这样的:
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']
and $_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']
同一页面)。