鉴于我最近的问题(PHP-表单发布时会话丢失/清空),在发布表单时,会话ID几乎是随机重新生成的(登录->将项目添加到购物篮或将项目添加至购物篮->登录),导致会话数据丢失。一个解决方案被曝光,我可以将会话ID作为隐藏输入来传递,以强制会话ID自我维护。这是一个实用的解决方案吗?这会让我暴露出任何漏洞吗?
请注意,我的网站是在共享服务器上运行的。
它不会影响您的安全级别。会话ID以cookie的形式存储在用户浏览器上,您建议将其保存在HTML源中。无论哪种方式,最终用户或使用网络嗅探器的恶意实体都可以访问这些数据。因此,如果它能让你的工作更轻松,你就可以使用它。
我会在黑暗中试探一下,猜测当你将表单提交到不同的子域时,即你在http://www.example.com,并且您正在向https://secure.example.com或类似物。
如果是这样,您需要确保会话cookie域设置为使用您网站的所有子域,而不仅仅是您当前的子域。您可以使用进行检查
ini_get('session.cookie_domain');
// if this outputs something like "www.example.com" and you're submitting to
// "somethingelse.example.com", here's your problem.
如果设置不正确,可以在php.ini或脚本中进行设置:
ini_set('session.cookie_domain', '.example.com'); // or...
session_set_cookie_params(ini_get('session.cookie_lifetime'), ini_get('session.cookie_path'), '.example.com');
session_start();
或者,您可以确保在提交表单时使用相同的子域,因为在这种情况下很少有充分的理由使用不同的子域。
或者你的问题可能完全无关。无论如何都值得一看。
但是,正如@Kaustubh Karkare所说,通过表单传递会话变量的安全性与通过cookie传递会话变量相同。至于实用性,如果不经常使用的话,这是一种非常合理的传递会话ID的方式。
不要发布它,而是从表单转到您的操作页面并使用此
<?php
//let's start the session
session_start();
$_SESSION['whateveryouwanttocallit'] = session_id()
?>
所以基本上根本不要发布。。。。
您可以通过以下方式进行检查:
<?php print_r($_SESSION)?>
并可确认为:<?php echo session_id()?>
然而,在回答你的问题时,这不是一个好的解决方案。
通过将会话id发布到您的会话,您只需创建信息的副本并根据需要命名,会话id就已经在您的会话中了。
此外,如果你打算在隐藏输入中使用你的会话ID作为cookie的形式,以确保他们关于该用户的信息不会丢失,那么问题将是:
- 具有此新创建的会话id的会话也将被擦除
- 即使它保持不变,会话id也将重新生成,因此是一个不同的字符串