将PHP会话ID作为POST参数传递


Passing PHP Session ID as a POST parameter

鉴于我最近的问题(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的形式,以确保他们关于该用户的信息不会丢失,那么问题将是:

  1. 具有此新创建的会话id的会话也将被擦除
  2. 即使它保持不变,会话id也将重新生成,因此是一个不同的字符串