我开发了一个使用基于cookie的会话的
PHP Web应用程序,它一切正常 – 直到我意识到它将无法在禁用第三方cookie的浏览器中工作(因为脚本将在iframe上加载另一个网站/域名).
所以我决定切换到基于URL的会话(我认为这是安全的,因为脚本在iframe中,没有可见的URL供用户共享或书签等).
但是,出于某种原因,由于我切换到基于域的会话,我的Web应用程序中的每个页面都使用不同的会话ID.
这是我的代码……
ini_set("session.use_cookies", 0);
ini_set("session.use_only_cookies", 0);
ini_set("session.use_trans_sid", 1);
ini_set("session.cache_limiter", "");
session_start();
echo "
Session ID: " . session_id() . "
"; // 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():
session.auto_start Off Off
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_httponly Off Off
session.cookie_lifetime 0 0
session.cookie_path / /
session.cookie_secure Off Off
session.entropy_file no value no value
session.entropy_length 0 0
session.gc_divisor 1000 1000
session.gc_maxlifetime 1440 1440
session.gc_probability 1 1
session.hash_bits_per_character 5 5
session.hash_function 0 0
session.name PHPSESSID PHPSESSID
session.referer_check no value no value
session.save_handler files files
session.save_path /tmp /tmp
session.serialize_handler php php
session.upload_progress.cleanup On On
session.upload_progress.enabled On On
session.upload_progress.freq 1% 1%
session.upload_progress.min_freq 1 1
session.upload_progress.name PHP_SESSION_UPLOAD_PROGRESS PHP_SESSION_UPLOAD_PROGRESS
session.upload_progress.prefix upload_progress_ upload_progress_
session.use_cookies On On
session.use_only_cookies On On
session.use_strict_mode Off Off
session.use_trans_sid 0 0
有任何想法吗?