繁体   English   中英

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

[英]Is this a safe use of Session Variables?

我使用$ _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。

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

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

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

您还需要考虑以下事项:

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

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

是的,这几乎是正确的想法。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM