PHP – 使用session.use_trans_sid时会话ID更改

前端之家收集整理的这篇文章主要介绍了PHP – 使用session.use_trans_sid时会话ID更改前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我开发了一个使用基于cookie的会话的 PHP Web应用程序,它一切正常 – 直到我意识到它将无法在禁用第三方cookie的浏览器中工作(因为脚本将在iframe上加载另一个网站/域名).

所以我决定切换到基于URL的会话(我认为这是安全的,因为脚本在iframe中,没有可见的URL供用户共享或书签等).

但是,出于某种原因,由于我切换到基于域的会话,我的Web应用程序中的每个页面都使用不同的会话ID.

这是我的代码……

  1. ini_set("session.use_cookies",0);
  2. ini_set("session.use_only_cookies",0);
  3. ini_set("session.use_trans_sid",1);
  4. ini_set("session.cache_limiter","");
  5. session_start();
  6. echo "<p>Session ID: " . session_id() . "</p>"; // Test output

…这是在每个页面调用的第一件事(没有我以前的输出).

我的Web应用程序的第一页包含一个表单,我看到PHP自动添加了所需的隐藏会话ID输入:

< input type =“hidden”name =“PHPSESSID”value =“m4jbeec47uplnf95ue2h244a02”/>

但是下一页(表单提交)报告的会话ID是

会话ID:iiovfkrf3hesj1um5orasv7it6

此外,当我使用https://(而不是http://)加载第一页时,提交表单会导致重新加载相同的页面(而不是正在加载的下一页).

我已经尝试过的:

ini_set(“session.cookie_secure”,0);

ini_set(“session.cookie_secure”,1);

ini_set(‘session.gc_maxlifetime’,30 * 60); //在30分钟后到期

和(在脚本的末尾)

session_write_close();

删除

ini_set(“session.cache_limiter”,“”);

来自PHPinfo():

  1. session.auto_start Off Off
  2. session.cache_expire 180 180
  3. session.cache_limiter nocache nocache
  4. session.cookie_domain no value no value
  5. session.cookie_httponly Off Off
  6. session.cookie_lifetime 0 0
  7. session.cookie_path / /
  8. session.cookie_secure Off Off
  9. session.entropy_file no value no value
  10. session.entropy_length 0 0
  11. session.gc_divisor 1000 1000
  12. session.gc_maxlifetime 1440 1440
  13. session.gc_probability 1 1
  14. session.hash_bits_per_character 5 5
  15. session.hash_function 0 0
  16. session.name PHPSESSID PHPSESSID
  17. session.referer_check no value no value
  18. session.save_handler files files
  19. session.save_path /tmp /tmp
  20. session.serialize_handler PHP PHP
  21. session.upload_progress.cleanup On On
  22. session.upload_progress.enabled On On
  23. session.upload_progress.freq 1% 1%
  24. session.upload_progress.min_freq 1 1
  25. session.upload_progress.name PHP_SESSION_UPLOAD_PROGRESS PHP_SESSION_UPLOAD_PROGRESS
  26. session.upload_progress.prefix upload_progress_ upload_progress_
  27. session.use_cookies On On
  28. session.use_only_cookies On On
  29. session.use_strict_mode Off Off
  30. session.use_trans_sid 0 0

有任何想法吗?

我认为问题必定是由于我的代码中的某个错误.我在下面创建了测试脚本,它按预期工作(在同一台服务器上):

URL的会话test.PHP

  1. <?PHP
  2.  
  3. $page_title = "URL Session Test (v11)";
  4.  
  5. ini_set("session.use_cookies",1);
  6. //ini_set("session.cache_limiter","");
  7. ini_set('session.gc_maxlifetime',30 * 60); // expires in 30 minutes
  8. session_start();
  9. $session_id = session_id();
  10.  
  11. $is_new_session = !isset($_SESSION["existing"]);
  12. $_SESSION["existing"] = true;
  13. if ($is_new_session) {
  14. $_SESSION["my_key"] = "MY PRIVATE KEY";
  15. }
  16. $my_session_key = $_SESSION["my_key"];
  17.  
  18. $timezone = $_SESSION["timezone"];
  19. if ($timezone) {
  20. date_default_timezone_set($timezone);
  21. }
  22.  
  23. if ($_POST['PHPSESSID']) {
  24. $session_id_received = $_POST['PHPSESSID'];
  25. }
  26. else {
  27. $session_id_received = "";
  28. }
  29.  
  30. ?><!DOCTYPE html>
  31. <html>
  32. <head>
  33. <title><?PHP echo $page_title; ?></title>
  34. </head>
  35. <body>
  36. <h1><?PHP echo $page_title; ?></h1>
  37. <p>Is new session: <?PHP echo $is_new_session; ?></p>
  38. <p>My session key: <?PHP echo $my_session_key; ?></p>
  39. <p>Received session ID: <?PHP echo $session_id_received; ?></p>
  40. <p>Actual session ID: <?PHP echo $session_id; ?></p>
  41. <form method="POST">
  42. <input type="submit" value="Click this form submit button to see how if the above session ID is received by the next page" />
  43. </form>
  44. <a href="url-session-test.PHP">Hover over this link to check the session ID parameter</a>
  45. </body>
  46. </html>

我发现它后会发布实际的bug …

UPDATE

问题是我使用的是POST-Redirect-GET模型,而我没有将所需的PHPSESSID参数附加到GET URL!

猜你在找的PHP相关文章