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

时间:2012-03-17 14:36:10

标签: php forms security session

根据我最近的问题(PHP - Session lost/emptied on form post),会话ID几乎随机在发布的表单上重新生成(登录 - >将项目添加到购物篮或将商品添加到购物篮 - > gt;登录),导致会话数据丢失。解决了一个问题,我可以将会话ID作为隐藏输入传递,以强制会话ID维持自身。这是一个实际修复?这会让我对任何漏洞开放吗?

请注意,我的网站是在共享服务器上运行的。

3 个答案:

答案 0 :(得分:1)

我会在黑暗中捅一下并猜测当你将表单提交到不同的子域名时,即你在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的方式。

答案 1 :(得分:0)

它不会影响您的安全级别。会话ID存储为用户浏览器上的cookie,您建议将其保存在HTML源代码中。无论哪种方式,最终用户或使用网络嗅探器的恶意实体都能够访问此数据。因此,如果能让您的工作更轻松,您就可以使用它。

答案 2 :(得分:-1)

解决了这个问题,以为我会更新你。

不要发布它,而是从表单转到您的操作页面并使用此

<?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也会被重新生成,因此是一个不同的字符串。
  3. 如果这有帮助,请提前投票!