2015-07-22 49 views
1

我注意到了PHP中的一个奇怪行为。在php.ini,session.hash_function设置为sha256,PHP生成一个合适的PHPSESSID,但是,它也将花费ANY值由用户提供,即使它更短。PHP会话处理程序和PHPSESSID生成/验证

wget --header="Cookie: PHPSESSID=notrandom" "http://someserver.com/test.php" 

例如,上述线路将触发会话处理器和notrandom创建一个新的会话,如果它是一个有效的会话。

我的问题是双重的:

    • 这是正常/期望行为?
    • 是那里的会话处理的方式读/写功能的信号到PHP所提供的会话ID是无效的(即不是sha256)和会话无法启动?

    • 或者,如果客户端提供的会话ID无效(或仅仅找不到),服务器生成自己的值(session_regenerate_id?)而不是使用用户提供的值是否更合理?

回答

2

会议,按照惯例,在那里为网站访问者的方便。使用复杂算法自动生成(用于新会话)的事实仅有助于防止会话攻击,但不应该依赖于此。在更有意义的Web应用程序中,应使用身份验证和授权来确保与Web服务器之间的请求和响应的安全。

为了更具体地回答您的问题:

  1. 是的,这是正常/期望的行为。
  2. 请参阅@ 0x90的回应;然后使用session_status()documentation)来决定下一步该做什么。
  3. 一旦你实现从#2的变化,上面,你会已经涉及了无效会话的请求被接受,要么建立一个有效的,或相应的响应代码(403 - 禁止)响应的情况。
+0

Got it! session_status()可能是要走的路,但我还没有PHP 5.4(仍然在5.3),所以通过使用自定义Session Handler来读取()并检查提交的PHPSESSID是否存在找到解决办法。这只在需要现有会话的页面上完成 - 其他会调用session_start()并绕过此问题/解决方案。 – pracheta986919

2

是的,这是一个安全问题,因为它会导致会话固定。这类漏洞非常普遍,同样也被普遍利用。

你需要设置session.use_strict_mode=On在php.ini防止PHP从接受这些任意设置会话ID。

来源:http://php.net/manual/en/session.security.php