1

我在这里扯掉我的菜鸟头发。无法理解为什么下面的代码不起作用。页面加载正常,但是当我尝试使用数据库中的用户名和密码登录时,页面只是使用登录表单重新加载到其原始状态,而我实际上希望看到一个注销按钮。我还尝试将没有盐和散列的密码与数据库中未散列的、未加盐的等效项进行比较。不工作。

我得到的唯一警告是“依赖系统的时区设置是不安全的”。,而且我认为这些与密码验证功能没有任何关系。

页面开始是这样的:

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)。它将输入字段的值发布usernamepassword$_SERVER['REQUEST_URI']同一页面)。

4

3 回答 3

4

在我看来,您缺少mysql_query()函数,这意味着您实际上并未执行查询。

mysql_query — 发送 MySQL 查询

执行以下操作,看看它是否有效:

$result = mysql_query($query);

$passwordindatabase = mysql_fetch_assoc($result);

编辑
在一个完全不同的注释上,您不应该使用 mysql 函数,因为它们非常老式并且具有 mysql_injection 漏洞。我建议你尽快开始使用 PDO,它(如果做得好)没有 mysql_injection 漏洞。

于 2012-05-15T13:05:52.040 回答
0

要使用基于 cookie 的会话,session_start()必须在向浏览器输出任何内容之前调用。

但是,时区警告是之前发送的。

php.ini在文件中设置时区。

编辑..不仅是这个问题。您必须mysql_query()在 sql 请求之前使用函数mysql_fetch_assoc()

于 2012-05-15T12:48:29.467 回答
0

关于您显示的代码的唯一“气味”是:

if ($password == $passwordindatabase) {

我更喜欢看到这样的东西:

if (strcmp($password, $passwordindatabase) == 0) {

我们还需要查看您实际将值插入users表中的代码,因为很明显$password并且$passwordindatabase不匹配。

于 2012-05-15T12:55:14.777 回答