0

我有一个简单的登录表单,在用户输入用户名和密码后,它会将用户发送到下面的页面。此页面验证用户名和密码是否正确,然后将它们发送到站点。除了我尝试在会话中存储“userid”的部分之外,这一切都有效。我想存储用户 ID,以便我可以运行查询并使用用户的相关信息填充站点的其余部分。您可能会说,我对此仍然很陌生,因此我们将不胜感激。

<?php 
session_start();

if($_SERVER['REQUEST_METHOD']=='POST'){

    try{
        $con = new PDO('mysql:host=localhost;dbname=DBNAME','USERNAME','PASSWORD');
        $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $con->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    }catch (Exception $e){
        die('Cannot connect to database. Details:'.$e->getMessage());
    }
    $query = $con->prepare("SELECT 1 FROM userprofile WHERE username=:username && password=:password");

    $query->bindParam(":username", $_POST['myusername']);
    $query->bindParam(":password", $_POST['mypassword']);
    $query->execute();

    $result = $query->fetchAll(PDO::FETCH_ASSOC);

    if(!empty($result)){
        $_SESSION['loggedin']=1;
        $_SESSION['myusername']=$_POST['myusername'];
        $_SESSION['userid'] = ("SELECT id FROM userprofile WHERE username=:username && password=:password");

        exit(header('Location: index.php'));
    }else{
        exit(header('Location: login.php'));
    }

}else{
    exit(header('Location: login.php'));
}
?>

另一个简单的问题:将我的数据库名称、用户名和密码存储在此页面上是否安全?即使这只是一个与服务器对话并且从未显示的页面,有人可以访问此信息并登录到我的数据库吗?

4

3 回答 3

1

问题是什么,会话没有被存储?例如,尝试回显 $_SESSION['myusername'],或使用 Firebug 查看存储的值(如果有)。

于 2013-04-16T20:32:31.897 回答
1

您正在尝试直接从查询结果中为会话变量赋值。你不能这样做,因为运行你的查询返回一个数组,而不是一个简单的字符串。

尝试这个:

print_r($result);

您应该会看到查询返回的值的数组,然后您可以找到您要查找的值并将其分配给会话变量。

于 2013-04-16T20:34:13.597 回答
0

您应该只在第一个查询中获取用户信息,而不是使用第二个查询或在会话中存储它的查询:

$query = $con->prepare("SELECT id FROM userprofile WHERE username=:username AND password=:password LIMIT 1");

$query->bindParam(":username", $_POST['myusername']);
$query->bindParam(":password", $_POST['mypassword']);
$query->execute();

$result = $query->fetch(PDO::FETCH_ASSOC);
$query->closeCursor();

if(!empty($result)){
    $_SESSION['loggedin']=1;
    $_SESSION['myusername']=$_POST['myusername'];
    $_SESSION['userid'] = $result['id'];

    exit(header('Location: index.php'));
}else{
    exit(header('Location: login.php'));
}

此外,您发布的代码会让我相信您将密码直接存储在数据库中。你不应该这样做,你应该用盐对它们进行散列并比较登录的散列。

于 2013-04-16T20:38:13.127 回答