这是会话变量的安全使用吗?

时间:2011-11-29 22:57:29

标签: php security web-applications

我使用$ _SESSION ['name']来处理页面之间的数据。我主要使用它来保持用户在页面之间登录。在每个页面中,我检查$ _SESSION [logged_in']是否为真。如果为true,请保持用户登录。否则,请执行其他操作。

这就是我处理会话的方式 - 基本样本:

<?php

session_start();

if($_SESSION['logged_in'])
{
   //show control panel list
}
else
{
     //show login box. Once user logs in. Once user logs in,
     //fetch userID, username, etc from database. Also set 
     //$_SESSION['logged_in'] = true.
}

?>

在代码之间的某处,我执行以下操作:

SELECT * FROM User WHERE userID = $_SESSION['userID'];

我不确定用户是否可以访问$ _SESSION ['userID']。如果它是可访问的,那么页面将处于威胁状态,因为用户可以手动更改用户ID并访问他/她希望的其他帐户。

我对安全性不太了解。请指教!我该怎么办?

注意:我正在努力使代码尽可能简单。目前,没有涉及oop。

4 个答案:

答案 0 :(得分:3)

您的代码容易受到会话固定和会话劫持攻击。有关详细信息,请参阅http://phpsec.org/projects/guide/4.html

当您构建更大,更复杂的应用程序时,您还需要小心如何处理将用户注销并处理其他与会话相关的方面,例如权限提升。安全地处理会话和登录是一个棘手的野兽。

实施安全身份验证很难。除非你是作为一个学术练习,否则我强烈建议使用你的框架提供的库,如果你有幸有一个好的。

您还需要考虑以下内容:

  • 不允许强制使用会话ID。 [会议录制]
  • 更改权限或凭据时(例如,因为用户现已登录或注销)然后 立即使会话无效并重新开始。
  • 提供注销功能,并确保在注销时使会话无效。
  • 将会话cookie设置为HttpOnly - 优选地,要求HTTPS并且仅将cookie设置为仅安全。
  • 考虑限制会话有效性以包括检查有助于匹配用户的一些其他信息,例如用户代理。 [会话劫持]
  • 不使用后始终过期,并且不要通过将用户重新连接到旧的http会话来实现“让我登录”。
  • 确保在会话失效时销毁所有与会话相关的数据,无论其存储位置如何。一个新用户出现,可能恰好被分配了之前使用过的会话ID。此新会话不能访问先前根据该会话ID设置的会话数据。

答案 1 :(得分:2)

$ _ SESSION是服务器端Super Globals之一。用户无法访问它或以任何方式从您的服务器传输。

答案 2 :(得分:1)

是的,这是非常正确的想法。

以下是一些可能有用的资源,通常可以理解会话安全性和安全编程:

http://phpsec.org/projects/guide/4.html http://phpsec.org/projects/guide/

答案 3 :(得分:1)

这非常好,这里有一些其他的会话管理技巧:

  1. 不接受来自GET / POST变量的会话标识符: 建议不要使用URL中的会话标识符(查询字符串,GET变量)或POST变量,因为它可以简化此攻击。在设置GET / POST变量的表单上很容易建立链接。

  2. 在每个请求上重新生成SID: 在PHP中使用session_regenerate_id()。每次用户的访问级别更改时,都必须重新生成会话标识符。这意味着虽然攻击者可能欺骗用户接受已知的SID,但是当攻击者试图重新使用SID时,SID将无效。