【问题标题】:Best way to save object's data in php?在 php 中保存对象数据的最佳方法?
【发布时间】:2011-11-02 12:31:29
【问题描述】:

我正在尝试在 php.ini 中创建一个登录系统。我有 3 个文件。 index.php、login.class.php(定义登录类)、securePage.php。

登录类有getUserName()、addUser()等不同的函数

index.php 创建一个新的 $login 对象,有一个登录表单并创建一个新的帐户表单。

当您在 index.php 页面上创建帐户时, $login->addUser($username, $password, $first_name, $last_name, $email);函数执行创建一个新帐户。

在您登录并点击提交后,脚本会检查您的用户名/密码/等并将您重定向到securePage.php。

在我从 login.class.php 重定向到 securePage.php 后,我不确定检查用户是否正确登录以及是否将所有用户信息放在手边的最佳方法是什么。

现在我的securePage.php 创建了一个新的登录对象 $login = 新登录;并通过在 Login 类中调用 checkAccess 来检查用户是否有权访问该页面。

//检查用户是否可以访问该页面,否则重定向到登录页面

if($login->checkAccess()) {
   //blah blah blah
}

这就是登录类中 checkAccess 函数的样子

public function checkAccess() {

    // check the session access
    if(isset($_SESSION['username']) ) {
        //
        return true;
    }

}

我觉得这是一个糟糕的实现,因为 a) 我创建了一个全新的登录对象并丢失了我的数据 b)我只通过检查会话的用户名是否设置来检查会话是否安全,这可能是伪造的。

就仍然拥有所有用户数据并检查用户是否登录而言,实现securePage.php的最佳方法是什么?

【问题讨论】:

  • 服务器端的会话cookie

标签: php session login logging


【解决方案1】:

会话数据是服务器端数据——它只能通过手动猜测 PHPSESSIONID 来伪造(您可以阅读here)。

通常处理这种情况的方式是两种方式之一。如果使用 HTTP 身份验证(BTW 有一些主要好处),那么基本上每次需要进行安全事务时,都必须测试 UN/PW。另一方面,如果服务器正在存储该值(例如在$_SESSION 或其他框架等效项中),则服务器已经拥有数据并且没有必要重新查询。

如果你正确实现了__sleep and __wakeup方法,你可以简单地将整个登录对象存储在$_SESSION中,这通常是我的偏好。

【讨论】:

  • 没错。您可以添加更多检查和限制,显然有给合法用户带来不便的风险。我认为,除非它真的是关键任务,否则会话就足够了。
  • 我没有实现 __sleep 和 __wakeup。除了将整个登录对象放在 SESSION 中之外,还有其他方法可以传递该信息吗
  • 如果它是一个简单的对象,那么将整个东西存储在 SESSION 中确实是您的最佳选择。如果它不简单,那么您可能可以解耦其中的一些逻辑。
【解决方案2】:

您的会话存储在服务器端,因此是检查登录状态的好方法。有一些问题,例如 f.e.帐户共享,但对于您正在开发的应用程序来说,它们应该不是问题。

不过,我不会检查用户名,我会添加一个名为“授权”的密钥或其他东西。我也会调用函数 isAuthorised 而不是 checkAccess,因为 checkAccess 会指示我使用用户角色/权限。

【讨论】:

  • 有没有一种方法可以将一个对象传递给我的securePage.php,而不是在没有序列化的情况下创建一个新对象(我可能会实现它,但我想知道是否有另一种方法)
  • 在 session/memcached/database 或其他存储中没有序列化?没有。
猜你喜欢
  • 1970-01-01
  • 2016-06-05
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 2019-01-30
相关资源
最近更新 更多