$ _SESSION数组的安全性

时间:2009-08-26 09:55:53

标签: php security session

当低权限非管理员用户成功登录我的网络应用程序时,我将以下数据存储在$_SESSION数组中:

$_SESSION = array(
    'user_id'     => 2343,  // whatever their user_id number is from the DB
    'allow_admin' => false, // don't give them access to admin tools
    'allow_edit'  => false, // don't let them edit stuff
    );

除了以某种方式编辑$_SESSION中的会话文件外,他们是否可以操纵/tmp数组来为其提供管理员或编辑权限? (以上代码是将这些项目添加到$_SESSION

的唯一位置

6 个答案:

答案 0 :(得分:9)

会话内容仅在服务器端可见且可修改。

如果您的应用程序或服务器包含某些漏洞,则只能以“未经授权”的方式修改它们。

您还应该了解session fixation attacks之类的内容,攻击者会将特定会话ID强制转移给毫无戒心的用户,该用户登录并提升该会话的权限时,允许攻击者共享该会话。 / p>

每当您更改会话的权限级别时,缓解这些的一种方法是regenerate the session id

另见这个问题:

答案 1 :(得分:4)

如果你想避免javascript在中间攻击中读取你的cookie和man,你需要使用带有https的服务器并将会话cookie设置为仅通过https传输。

session.cookie_secure指定是否应仅通过安全连接发送Cookie。默认为关闭。此设置已在PHP 4.0.4中添加。另请参见session_get_cookie_params()和session_set_cookie_params()。

session.cookie_httponly仅通过HTTP协议将cookie标记为可访问。这意味着脚本语言(例如JavaScript)无法访问cookie。此设置可以有效地帮助通过XSS攻击减少身份盗用(尽管并非所有浏览器都支持)。

为了更好地保护管理员权限,让某人无人看守他的计算机几分钟,你应该在最后(管理员)登录时有一个计时器。如果该时间超过x timeunits,用户必须再次登录才能使用管理员权限。

较短的会话也比较长的会话更安全。

答案 2 :(得分:3)

服务器

会话存储在服务器上。如果用户可以直接访问存储会话的目录,则可以更改会话数据。解决方案是保护目录。并确保您的PHP代码中没有漏洞,允许通过$ _POST或$ _GET设置user_id。

客户端

但是在客户端,操作会话可能hijacking某人session_id。这将使劫机者成为该用户。并代表他们发送请求。

还有跨站请求伪造。这是黑客欺骗用户发送him请求的时候。通过让他点击一个链接,例如。你可以使用令牌来解决这个问题。令牌是生成的字符串,放在$ _SESSION数组中,并在每个HTML表单中作为隐藏字段。当用户提交表单时,将相互检查值。每次用户请求新页面时,令牌都会发生变化。这样攻击者就必须尝试预测令牌,这取决于你如何制作令牌。

链接还将显示这些攻击的示例。

答案 3 :(得分:2)

如果您不在脚本中提供此类访问权限,则用户无法做到这一点。所以你的会话数据应该非常安全。用户唯一能做的就是操纵URL中传递的会话cookie或会话ID,但他不太可能找到另一个用户的现有会话ID。

答案 4 :(得分:1)

除非您在某处留下安全漏洞(例如允许用户以某种方式添加/更改$ _SESSION数据)。

答案 5 :(得分:1)

据我所知,不,除非用户猜测你的会话ID并将其替换为他的cookie。您应该至少在服务器端添加额外的IP检查以防止这种情况。