这是对会话变量的安全使用吗?
Posted
技术标签:
【中文标题】这是对会话变量的安全使用吗?【英文标题】:Is this a safe use of Session Variables? 【发布时间】:2012-01-09 06:37:02 【问题描述】:我使用 $_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。
【问题讨论】:
用户可以操纵他们的cookies,而不是他们的会话数据,这就是简短的答案......我认为你做得很好。 Maby 评估是否应该将未登录的用户踢出到单独的登录页面并退出,以避免脚本继续运行。 长答案:您的用户仅获得一个 session_id,它要么通过 cookie 传递,要么通过 get 变量传递。此标识符允许 PHP 查找该用户的会话,该会话存储在您的服务器上(默认情况下在文件中)。 PHP 读取会话数据并用数据填充 $_SESSION 超级全局。用户无法直接访问会话数据,因此可以在其中存储敏感数据。 How safe are PHP session variables?的可能重复 【参考方案1】:您的代码容易受到会话固定和会话劫持攻击。请参阅http://phpsec.org/projects/guide/4.html 了解更多信息。
当您构建更大、参与度更高的应用程序时,您还需要注意如何处理注销用户和处理其他与会话相关的方面,例如权限提升。安全地处理会话和登录是一个棘手的问题。
实施安全身份验证很困难。除非您将其作为学术练习,否则我强烈建议您使用框架提供的库,如果您有幸拥有一个好的库。
您还需要考虑以下事项:
不允许强制使用会话 ID。 [会话固定] 当权限或凭据发生更改时(例如,因为用户现在已登录或注销),然后 立即使会话无效并开始新的会话。 提供注销功能,并确保在注销时使会话无效。 将会话 cookie 设置为 HttpOnly - 最好要求 HTTPS,并且将 cookie 设置为仅安全。 考虑限制会话有效性以包括检查一些有助于匹配用户的其他信息,例如用户代理。 [会话劫持] 始终在不使用会话后过期,并且不要通过将用户重新连接到其旧的 http 会话来实现“保持登录”。 确保在会话无效时销毁所有与会话相关的数据,无论其存储在何处。出现的新用户可能恰好被分配了一个以前使用过的会话 ID。此新会话不得访问之前针对该会话 ID 设置的会话数据。【讨论】:
【参考方案2】:很好,这里有一些其他的会话管理技巧:
不接受来自 GET/POST 变量的会话标识符: 不推荐使用 URL(查询字符串、GET 变量)或 POST 变量中的会话标识符,因为它可以简化这种攻击。在设置 GET/POST 变量的表单上创建链接很容易。
在每个请求上重新生成 SID: 在 PHP 中使用 session_regenerate_id()。每次用户的访问级别发生变化时,都需要重新生成会话标识符。这意味着虽然攻击者可能会诱骗用户接受已知的 SID,但当攻击者尝试重新使用 SID 时,该 SID 将无效。
【讨论】:
【参考方案3】:是的,这几乎是正确的想法。
这里有一些资源可能有助于理解会话安全和一般的安全编程:
http://phpsec.org/projects/guide/4.html http://phpsec.org/projects/guide/
【讨论】:
【参考方案4】:$_SESSION 是服务器端Super Globals 之一。用户无法访问或以任何方式从您的服务器传输。
【讨论】:
以上是关于这是对会话变量的安全使用吗?的主要内容,如果未能解决你的问题,请参考以下文章