php - 密码验证不登录只是重新加载登录页面

标签 php mysql authentication

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

我收到的唯一警告是“依赖系统的时区设置是不安全的。”,我认为这些与密码验证功能没有任何关系。 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) 时显示。它将输入字段 usernamepassword 的值发布到 $_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/

相关文章:

php - 缺货时的 WooCommerce "CONTACT"按钮

php - CSV 仅导出标题数组而不是数据

MySQL从同一个表中连接多个列

ruby-on-rails - Rails.env 在测试中返回 'development' 导致设计真实性 token 破坏测试?

java - Spring Security 针对本地 Linux 帐户进行身份验证

php - 在第二个查询中使用第一个查询的结果

php - 根据结束日期每月有效订阅?

php - 使用 RSS 获取整个博客存档

mysql - 如何在 REGEX mysql 上转义 "@"?

authentication - 身份验证期间缓冲