我使用$ _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。
答案 0 :(得分:3)
您的代码容易受到会话固定和会话劫持攻击。有关详细信息,请参阅http://phpsec.org/projects/guide/4.html。
当您构建更大,更复杂的应用程序时,您还需要小心如何处理将用户注销并处理其他与会话相关的方面,例如权限提升。安全地处理会话和登录是一个棘手的野兽。
实施安全身份验证很难。除非你是作为一个学术练习,否则我强烈建议使用你的框架提供的库,如果你有幸有一个好的。
您还需要考虑以下内容:
答案 1 :(得分:2)
$ _ SESSION是服务器端Super Globals之一。用户无法访问它或以任何方式从您的服务器传输。
答案 2 :(得分:1)
是的,这是非常正确的想法。
以下是一些可能有用的资源,通常可以理解会话安全性和安全编程:
http://phpsec.org/projects/guide/4.html http://phpsec.org/projects/guide/
答案 3 :(得分:1)
这非常好,这里有一些其他的会话管理技巧:
不接受来自GET / POST变量的会话标识符: 建议不要使用URL中的会话标识符(查询字符串,GET变量)或POST变量,因为它可以简化此攻击。在设置GET / POST变量的表单上很容易建立链接。
在每个请求上重新生成SID: 在PHP中使用session_regenerate_id()。每次用户的访问级别更改时,都必须重新生成会话标识符。这意味着虽然攻击者可能欺骗用户接受已知的SID,但是当攻击者试图重新使用SID时,SID将无效。