我遇到了一个问题,即在一个类的一个方法中设置了cookie,而在另一个方法中,没有定义相同的cookie。为了更清楚,这是第一种方法的代码:
public function checklogpass($name,$psw)
{
try {
$pdo = new PDO('mysql:host=localhost;dbname=informal','vad','6989');
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$pdo->exec('SET NAMES "utf8"');
}
catch(PDOException $e) {
echo $e->getMessage();
}
$sql = 'SELECT login,password FROM users WHERE login = :name AND password = :psw';
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':name',$name);
$stmt->bindValue(':psw',$psw);
$stmt->execute();
$row = $stmt->fetch();
if (isset($name) && isset($psw)) {
if($name == $row['login'] && $psw == $row['password']) {
setcookie("log",$name,time()+3600);
header('Location: /OpenS/app/auth/checkin.php');
} else {
$_SESSION['errors'] = 'Failed login or password';
header('Location: /OpenS/app/views/form.php');
}
}
}
另一个类的另一种方法:
public function getUser()
{
if (isset($_COOKIE["log"])){
return $_COOKIE["log"];
header('Location: /OpenS/app/views/home.php');
} else {
$_SESSION['notify'] = 'You are not logged in';
header('Location: /OpenS/app/views/home.php');
}
}
当我输入错误的用户名或密码时,脚本会正确地告诉我“登录或密码失败”。但是,当我输入正确的用户名和密码时,cookie已设置,重定向到主页,但在主页上会显示“您尚未登录”。
我通过将信息放在会话中解决了这个问题,但我认为这不是正确的解决方案。我怎样才能更好地做到这一点?
答案 0 :(得分:0)
您当前的方法根本就是错误的。通过设置cookie" log"使用等于用户名的值,您可以自由地打开任何人,无需任何登录凭据......
Cookie是存储在客户端计算机上的一段数据。客户端计算机上的所有数据都可以随意更改。除其他外,它们可以只更改cookie的值,并以管理员身份登录。
那么,你如何解决这个问题呢?您将信息放在会话中,就像您已经做过的那样。会话cookie相当安全,因为很难找到与其他人的会话冲突的cookie值。会话变量永远不会发送给用户,而是存储在服务器上。只有会话cookie在浏览器和客户端之间来回发送。