在php中保存对象数据的最佳方法?

时间:2011-08-24 06:04:01

标签: php session login logging

我正在尝试在php中创建一个登录系统。我有3个文件。 index.php,login.class.php(定义Login类),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 = new登录;并通过在Login类中调用checkAccess来检查用户是否可以访问该页面。

//检查用户是否有权访问此页面,否则重定向到登录页面

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

这是checkAccess函数在Login Class

中查看的方式
public function checkAccess() {

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

}

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

在仍然拥有所有用户数据并检查用户是否已登录的情况下,实施securePage.php的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

如果您已正确实施方法__sleep and __wakeup,则只需将整个登录对象存储在$_SESSION中,这通常是我的偏好。