首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >密码验证不登录只是重新加载登录页面

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

Stack Overflow用户
提问于 2012-05-15 12:36:49
回答 3查看 273关注 0票数 1

我要把我的胡言乱语扯下来。无法理解为什么下面的代码不能工作。页面加载正常,但是当我尝试用我的数据库中的用户名和密码登录时,页面就会被重新加载到它的原始状态,而我实际上希望看到一个注销按钮。我还尝试将没有salt和hash的密码与数据库中未散列、未加盐的等价物进行比较。不起作用。

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

页面的开头如下:

代码语言:javascript
复制
session_start();

error_reporting(-1); ini_set('display_errors', 'On');

然后跟随一些HTML。然后:

代码语言:javascript
复制
if (isset($_POST['log_out'])) {
    session_unset();
    session_destroy();
    $_SESSION = array();
}

当按下注销按钮时,会设置$_POST['log_out']。然后,我从一本书中获得了一个函数,用于防止SQL注入:

代码语言:javascript
复制
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'])时才能运行:

代码语言:javascript
复制
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'] (相同的页面)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-15 13:05:52

在我看来,您似乎缺少了查询()函数,这意味着您实际上没有执行查询。

mysql_query -发送MySQL查询

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

代码语言:javascript
复制
$result = mysql_query($query);

$passwordindatabase = mysql_fetch_assoc($result);

编辑

另外,您不应该使用mysql函数,因为它们非常陈旧,并且具有mysql_injection漏洞。我建议您尽快开始使用PDO,如果正确的话,它没有mysql_injection的易损性。

票数 4
EN

Stack Overflow用户

发布于 2012-05-15 12:48:29

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

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

php.ini文件上设置时区。

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

票数 0
EN

Stack Overflow用户

发布于 2012-05-15 12:55:14

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

代码语言:javascript
复制
if ($password == $passwordindatabase) {

我更希望看到这样的东西:

代码语言:javascript
复制
if (strcmp($password, $passwordindatabase) == 0) {

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10600802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档