2011-11-14 63 views
1

我已经建立了一个提供一些基本的“我可以这样做吗?”的类。我的网站的授权功能,比如“这个用户可以查看这个资源吗?”或“该用户是否可以添加图片?”存储授权对象到会话?

因此类对象实例化在不少页面(可能,每一页都具有用户交互)使用$authorize = new myAuthorizationClass();

然后myAuthorizationClass类中查找用户的ID,并检查他们的访问级别。

然后我可以这样说

if ($authorize->canAddImage()){ 
    // do image add stuff 
} 

是否有可能的,安全的和“最佳实践”这个$authorize对象存储到会话中?有没有另外一种方法来避免在每个页面上构建这个认证对象,并进行数据库交互等?

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

由于

+0

IIRC,在会话中存储授权信息被认为是不好的做法,特别是在基于cookie的会话中,因为cookie可能会非常容易地在不安全的wifi等设备上被窃取。 –

+0

@ truth - 谢谢,我认为你是对的,但是这会存储一个对象,然后执行身份验证操作作为函数。不确定这是否可能!但是,想要与专家权衡。 – julio

回答

0

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

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

+0

此外,你可以存储一些会话对象。正确使用__sleep()和__wake()方法,不要忘记在session_start()之前包含类定义(不需要使用外部加载)。 – Oroboros102

+0

这不是事实。服务器如何将您标识为该会话的所有者?它会向您发送一个会话ID,通常以Cookie的形式发送,并且该Cookie用于通过服务器进行身份验证以向您显示数据。但是,如果该cookie被盗,该怎么办?服务器会将攻击者误认为是您的,并且您的所有授权数据都将在他手中。 –

+0

@Truth:根据PHP的说法,您是正确的:“这可以存储在用户端的Cookie中,也可以在URL中传播。”但是我说过“用户数据”,在会话中存储是很好的。 –

0

我认为这被认为是不好练习存储授权会话中的数据。

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

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


有没有简单的解决方法,除了SSL和用户培训。如果您的站点需要非常高的安全性(例如金钱交易或关键数据库操作),请告知用户并提醒他们确认当地的安全措施。此外,如果您的网站处理关键数据库操作,请勿允许从Web应用程序完成任何关键操作(删除,表格删除等)。只能通过root用户。