2010-09-05 89 views
2

有没有人有任何想法,为什么这不起作用?强制要求会话ID

if(isset($_POST['PHPSESSID'])) { 
session_id($_POST['PHPSESSID']); 
session_start(); 
var_dump($_SESSION); 
} 

var_dump($ _ SESSION);永远是空的!它应该加载的东西!是否有防止强制会话ID的设置?自动启动未启用。

+0

你容易受到会话劫持btw。 – RobertPitt 2010-09-05 15:31:51

+0

@RobertPitt:请详细说明 – VolkerK 2010-09-05 17:45:34

+1

,如果我从另一位会员那里得到session_id,我可以通过POST注入并使用另一个成员的会话,访问我不应该能够访问的数据! – RobertPitt 2010-09-05 18:28:56

回答

1

您发布的代码是正确的。然而,你可能不会看到在您的会话变量的几个原因:

  • $_POST['PHPSESSID']未设置
  • $_POST['PHPSESSID']包含非数字字符
  • $_POST['PHPSESSID']并不是指一个人口会话ID
  • session_start()呼叫之前,被称为以session_id

如果没有这些应用,我不知道问题是什么,但为什么不尝试使用session_name()(这是专为你想要做的)而不是session_id

+0

谢谢。该变量已设置,因为if(isset())块中的var_dump正在发生,所以我知道这是返回true。 “非数字”的意思是“非字母数字?”你能解释如何使用session_name()来做到这一点吗? – 2010-09-05 15:33:26

+0

http://php.net/manual/en/function.session-name.php – RobertPitt 2010-09-05 15:37:24

+0

我的理解,通过链接确认,session_name()是会话cookie的名称,但session_id()是唯一值。我已经确认session_name()的值是“PHPSESSID”(默认值),因此无论是硬编码还是使用该函数进行检索,我都没有看到它会如何改变? – 2010-09-05 15:40:57

0

$_POST['PHPSESSID']一定是错误的:

根据会话处理器,并不是所有字符都会话ID内进行。例如,文件会话处理器只允许字符范围A-Z A-Z 0-9,(逗号)和 - (负)

检查其值。如果更改了会话处理程序,则必须仅为此特定会话处理程序使用允许的字符。


资源:

+0

$ _POST ['PHPSESSID']以“88rbfemtnma9padi34kfm7imk0”的形式出现。 session.save_handler是“文件”这让我发疯。我可以确认会话ID存在,因为在另一个浏览器中,我正在执行var_dump(session_id()),它返回通过请求进入的确切值。 – 2010-09-05 15:50:10

+0

你的代码中的会话是否被破坏? – 2010-09-05 15:58:08

-1

有与会话保存路径的问题。它没有正确设置,所以我可以猜测PHP依靠浏览器cookie创建会话而不是会话保存路径中的文件。