$salt = $this->get_salt($username);
if (is_null($salt)) {
return FALSE;
}
$password = sha1(SITE_KEY . $password . $salt);
$sth = $this->db->prepare("SELECT id, username, active FROM user WHERE username = ? AND password = ?");
$sth->setFetchMode(PDO::FETCH_OBJ);
$sth->execute(array($username, $password));
if (($result = $sth->fetch()) !== FALSE) {
return $result;
}
return FALSE;
这就是让我担心的原因:
我没有误解登录方法。我只是不认为它应该返回那个对象。我可能错了,你所做的一切都很好,但我对此表示怀疑。您正在将数据库中的完整用户对象、密码和所有内容返回到可能不安全的脚本。有人可能会创建一个新文件,然后执行类似 var_dump($userObject); 之类的操作。并拥有所有这些信息
此外,我只是发现从某物返回“神奇”属性是不直观的。这只是在使用前未经验证的另一件事。如果您要将其移至 auth 类中的单独方法并让它返回“active”的值,您可以运行您需要的任何验证,而无需使 login.php 脚本更明智。
: 再看一遍,如果你以这种方式滥用该对象,你已经需要知道登录信息。在我看来,最好还是把它分开,以防出现某种泄漏。不是说我知道有人能做到这一点。只需将其视为一个潜在的漏洞。
我不会假装理解恶意用户会如何做某事。我只知道让他们更容易这样做似乎并不明智。也许它没有任何问题,我不是安全专家。我只是在戳一些东西,如果我要写它,我会改变,因为它们对我来说似乎很危险。如果您真的想知道它是否危险,我建议将该示例提交给常规的 stackoverflow 社区,看看他们怎么说。
他说的有道理吗?该方法将在我拥有的页面控制器中使用:
$user = $auth->login('username, password)
if ($user) {
//do some additional checks... set session variables
}