Php 将授权对象存储到会话?

Php 将授权对象存储到会话?,php,security,authorization,Php,Security,Authorization,我已经构建了一个类,它为我的站点提供一些基本的“我可以这样做吗?”授权功能,比如“这个用户可以查看这个资源吗?”或者“这个用户可以添加图像吗?” 因此,使用$authorize=new myAuthorizationClass()在相当多的页面(可能是每个具有用户交互的页面)中实例化类对象 myAuthorizationClass类然后查找用户的ID并检查其访问级别 我可以这样说 if ($authorize->canAddImage()){ // do image add stu

我已经构建了一个类,它为我的站点提供一些基本的“我可以这样做吗?”授权功能,比如“这个用户可以查看这个资源吗?”或者“这个用户可以添加图像吗?”

因此,使用
$authorize=new myAuthorizationClass()在相当多的页面(可能是每个具有用户交互的页面)中实例化类对象

myAuthorizationClass
类然后查找用户的ID并检查其访问级别

我可以这样说

if ($authorize->canAddImage()){
    // do image add stuff
}
是否可以安全且“最佳做法”将此
$authorize
对象存储到会话中?有没有其他方法可以避免在每个页面上构建这个auth对象以及进行DB交互等开销

我不认为这可以简单到只说“将用户的身份验证级别设置为A、B或C,并在他们的会话中设置它!”因为他们对特定资源的访问取决于谁拥有资源、用户在站点中的角色等。我们必须根据访问的资源类型检查一些不同的事情


谢谢

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


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

我认为在会话中存储授权数据被认为是不好的做法

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

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


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


此外,如果您的站点处理关键数据库操作,则不允许从web应用程序执行任何关键操作(删除、删除表等)。仅通过root用户。

IIRC,在会话中存储授权信息被认为是一种不好的做法,尤其是在基于cookie的会话中,因为cookie很容易在不安全的wifi上被窃取。@truth--谢谢,我想你说得对,但这将存储一个对象,然后该对象作为函数执行身份验证操作。不确定这是否可能!不过,我想和专家们分享一下。此外,您还可以存储一些会话对象。正确使用
\u sleep()
\u wake()
方法,不要忘记在
会话启动()之前包含类定义(aoutoload不需要)。这不是真的。服务器如何将您标识为该会话的所有者?它向您发送一个会话ID,通常以cookie的形式,该cookie用于针对服务器进行身份验证,以向您提供数据。但是如果那块饼干被偷了怎么办?服务器会把攻击者误认为是你,你的所有授权数据都会在他手中。@真相:根据PHP的说法,你是对的:“这要么存储在用户端的cookie中,要么传播到URL中。”但我说的是“用户数据”,可以存储在会话中。嗯,OP确实说他想保存一个授权类,该类保存站点中的权限,而不是用户数据。要清楚,在会话中存储用户和授权数据是可以的,但通过cookie存储此数据是不可以的。保留用户数据/授权数据服务器端。