PHP $ _SESSION有时候工作有时它不会

时间:2015-07-27 07:44:51

标签: php .htaccess session sessionid

美好的一天,

我有一个小但不重要的问题。 创建了一个SESSION类,一般来说它工作得很好。

然而由于一些奇怪的原因,偶尔会开始怪癖,并为每个不同的页面/文件夹生成一个单独的sessionID。

情况如下。

我在自己的框架中使用Session类。 我的框架使用基于目录结构的路由。

如:

我是在 .htaccess 文件的帮助下完成的。

<IfModule mod_rewrite.c>
    RewriteEngine           on
    RewriteRule             ^$    core/    [L]

    # If the request is not for a valid directory
    RewriteCond %{REQUEST_FILENAME} !-d
    # If the request is not for a valid file
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule    (.*) core/$1    [L]
 </IfModule>

我尝试将所有流量路由到文件夹/core/index.php中的文件  在这里,我加载了所有模块和会话类。

  

问题

     

一般来说它运行良好。但是在常规的基础上(偶尔)   我登录后将用户从登录页面转发到起始页面。   在那里,它检测到用户尚未登录并转发他   回到登录页面。

     

所以你有一个域名。但是系统生成多个会话ID的多个文件夹

#1用户登录:

  

http://domain.com/login/

     

生成1个会话ID
  2登录检查
  3用户登录数据获取   注册资格
  4用户转到下一页

#2用户到达:

  

http://domain.com/start/
  应该保留1个会话ID。但   由于某种原因得到了再生   2用户无法进行身份验证和   转发到上一页

#3用户到达:

  

http://domain.com/login/
  找到1个原始会话ID
  2用户   使用存储在会话中的数据进行身份验证并转发到下一个   页

#4用户返回开始页面并再次找到另一个会话ID等。

我在开始会话前使用以下设置:

ini_set('session.cookie_lifetime',      432000);
///ini_set('session.cookie_path',           false); /// Disabled this option because this should be causing this issue. But to no avail unfortunately.
ini_set('session.cookie_domain',        'domain.com');
ini_set('session.cookie_secure',        false);
ini_set('session.cookie_httponly',      true);

ini_set('session.gc_probability',       0);

我想知道我可能犯了什么错误。 会话课当然要大得多。但我认为整体发布它会太大了。 如果对特定部分有任何疑问,我会发布。

希望有人能看到我的错误。 提前谢谢!

此时我通过删除所有域会话cookie来解决此问题。 然后我再次加载http://domain.com/login/并登录,一切都运行正常。但是在几天之后问题又出现了。

会话文件内容:

SessionIPaddress|s:9:"127.0.0.1";SessionuserAgent|s:72:"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0";Parking_loggedin|b:1;Parking_user|s:1:"1";Parking_level|s:1:"1";
  

指向文件的gitHub链接

     

https://github.com/alexhakkenberg/https---github.com-alexhakkenberg-sessionclass/blob/master/session.class.php

1 个答案:

答案 0 :(得分:2)

一些问题

大量的注释使得代码不会更多,但可读性更低。没有所有注释,文件只有~350行而不是714.更容易掌握较短文件的整体意图。很多评论也只是代码的重写,这些甚至都没有帮助。例如return(false)为自己说话,不得注释。

您正在复制PHP功能,尤其是有关cookie处理的问题。这已经由PHP完成了。

您正在WriteSession创建一个文件,该文件不包含会话数据,因此有点误导。 (会话数据实际上是由核心PHP函数保存的。)该文件只包含一些数据来检查会话,可能是为了防止劫持,但它没有明确用于防止劫持。通过检查存储在会话中的数据(正确的方式!)来防止劫持,因此不需要附加文件。 (请注意,一些代理在浏览您的网站时切换IP,因此检查完整的IPv4可能会让访问者感到烦恼。)

一些提示

  • 您正在使用存储代码将抽象层与会话数组(__get / __set)混合。请务必至少在您的脑海中将这两个方面分开,甚至将它们分成两个类。
    • 抽象层应包含session_start周围的所有内容,例如劫持预防,破坏会话,......并且不应该写入/检索任何数据。它应该完全基于$_SESSION
    • 存储层应该只完成一项任务:编写和检索$_SESSION
  • 除非您完全确定要实现的目标,否则只需使用自定义PHP函数来存储/检索会话数据。如果您出于任何原因想要更改数据的存储方式,请使用appropriate php methods for that。可能的用例是将会话存储在数据库中,以便能够轻松地使用数据。
  • 重新检查PHP已经为您提供的文档或PHP会话教程。不要再发明轮子了。
  • 不关心域名。在现实世界中,您可能永远不会遇到针对不同域的纠结会话的问题。 (因为会话的存储文件夹将设置为不同webroots的不同位置。)
  • 上次我看到它们时,反射方法仅用于“特殊用途”。规避程序员只需记下变量可能不是一个“特殊情况”。