将授权对象存储到会话?

时间:2011-11-14 18:48:27

标签: php security authorization

我已经建立了一个提供基本功能的课程“我可以这样做吗?”我网站的授权功能,例如“这个用户可以查看此资源吗?”或“这个用户可以添加图像吗?”

因此,使用$authorize = new myAuthorizationClass();

在很多页面(可能是每个具有用户交互的页面)中实例化类对象

然后myAuthorizationClass班级会查找用户的ID并检查他们的访问级别。

我可以说像

这样的话
if ($authorize->canAddImage()){
    // do image add stuff
}

$authorize对象存储到会话中是否可行,安全且“最佳实践”?是否有另一种方法可以避免在每个页面上构建此auth对象的开销,以及进行数据库交互等?

我认为它不会像简单地说“将用户的身份验证级别设置为A,B或C,并在其会话中设置它一样简单!”因为他们对特定资源的访问取决于谁拥有资源,用户在网站中扮演什么角色等等,我们必须检查一些不同的东西,具体取决于访问的资源类型。

由于

2 个答案:

答案 0 :(得分:0)

在会话(非cookie)中存储用户数据是可以接受的,因为这些数据存储在服务器端并为每个用户随机生成,并且只要您的会话处理存储受到保护,其他用户将无法访问

如果您希望通过不必查找每个页面请求的用户角色/访问来减少数据库负载,您可能需要考虑在成功登录时提取信息,然后将(以序列化格式)存储到会话变量中。然后,对于受保护的资源,您可以反序列化变量中存储的数据,进行检查,然后相应地继续。

答案 1 :(得分:0)

我认为在会话中存储授权数据被视为错误做法。

原因很简单,虽然数据本身存储在服务器端,在那里它是安全的,但较弱的链接实际上仍然(就像客户一样)。 服务器必须以某种方式识别拥有数据的客户端,这通常以发送给用户的 session_id cookie 的形式完成。该cookie将在每个请求中发送到服务器,服务器将能够通过(非常随机的)ID来确定您的身份。

但是,在不安全的WiFi(或计算机)上,攻击者很容易窃取该cookie,这会导致服务器将您识别为您。


除了SSL和用户教育之外,没有简单的方法。如果您的站点需要非常高的安全性(例如货币交易或关键数据库操作),请通知用户并建议他们确认当地的安全措施。

此外,如果您的站点处理关键数据库操作,请不要允许从Web应用程序完成任何关键(删除,表丢弃等)。只能通过root用户。