【问题标题】:Session not correct after coming back from a third party site从第三方站点返回后会话不正确
【发布时间】:2013-03-23 14:30:08
【问题描述】:

如果所有处理都在我自己的网站上进行,那么一切正常。会话变量被成功存储和检索。

现在我得到了第三方集成,它通过 POST 数据进行处理。我在每个 php 文件的第一行调用了session_start()

  • start_process.php - 如下设置一些会话变量并调用重定向到 response.php 的第三方

     $_SESSION["id"] = $id       // Echoing these shows the correct values 
     $_SESSION["name"]= $name    // Echoing these shows the correct values 
    
  • response.php - 此页面接收第三方的响应并尝试从会话变量中获取数据

     $id = $_SESSION["id"]           // This comes out to be blank
     $name = $_SESSION["name"]       // This comes out to be blank
    

在我的处理页面(即 response.php)上,我试图取回会话值,但没有取回会话变量。

在 SO 上搜索,很少有帖子建议检查

echo session_id();

首页和返回到我网站的后面的页面会有所不同。进一步搜索发现下面的值需要为空

echo ini_get('session.cookie_domain');

这确实是空白。现在我被卡住了,因为我看到这个值是空白的,即使会话没有正确加载。

你能建议下一步做什么吗?有调试吗?有什么提示可以解决这个问题吗?


更新

start_process.php

有一个表单,其发布操作是第三方网站的网址...

<?php session_start(); 
$_SESSION["Check"] = "Abc";
echo session_id();
>
<form name="myform" action="http://<ThirdPartyUrl.com>/pathToSomePage.jsp" method="POST">
          <!-- some  hidden fields with value  and some other text fields -->
</form>

response.php

第三方在发布请求中再次向我的响应页面提供响应,在该页面我直接测试 POST 变量的输出,在这里我尝试使用我的会话变量

<?php session_start(); 
echo $_SESSION["Check"];
echo session_id(); // This is different from the one printed in the start_process.php page
?>

我认为第三方托管不在同一台服务器上,因为目前我在共享主机上,而第三方肯定有自己的服务器。

【问题讨论】:

  • 请显示一些代码。
  • 尝试使用setcookie()
  • 请解释为什么你觉得这篇文章应该被关闭?我被困在这里很久了,试图找到解决方案,或者至少是前进的道路..
  • 第三方“发布”数据是通过常规 HTML 表单发送回您的网站,还是直接从他们的服务器发布? (例如 JSP 在服务器端创建 POST 请求)
  • @thaJeztah 提出了一个非常重要的问题……你能回答吗? POST 请求是如何产生的?是否是带有位置更改的 HTTP 3xx 代码(在这种情况下它应该可以正常工作)?您能否提供有关第三方网站或至少他们的 API 的更多详细信息?

标签: php session


【解决方案1】:

如果不看更多代码很难知道(start_process.php 是如何与第三方代码挂钩的,第三方是如何回到 response.php 的)。以下是一些猜测:

理论 1:第三方代码干扰了您的会话(如果托管在同一台服务器上)

此第三方集成是否托管在您的同一台服务器上?如果是这样,我怀疑第三方可能正在结束/重新创建或以其他方式修改您的会话。

理论 2:第三方使用单独的域重定向回您的网站

您是否有可能从 mydomain.com 开始,而第三方重定向回 www.mydomain.com(或类似的东西)?尽管这两个域看起来应该相同,但就 PHP 会话而言,它们完全不同,您最终会得到不同的会话。

【讨论】:

  • 好的。关于理论 2 的任何消息?我正在帮助其他人解决与您几乎相同的会话 ID 问题。他们意识到用户有时会从 mydomain.com 开始,而第三方网站会重定向回创建新会话的 www.mydomain.com
  • 我已经重新检查了网址。请求从 mydomain.com 开始,而不是 www 子域。
【解决方案2】:

我在处理购物车支付网关集成时遇到了类似的问题。如果最终通过浏览器访问响应脚本(即用户在第 3 方站点上完成后被重定向到 response.php),会话 ID 和 cookie 将被保留。如果通过来自 3rd 方站点的服务器端请求联系您的响应脚本,则该请求将被视为一个全新的会话。在这种情况下,许多集成允许您发送“直通”变量,该变量将与第 3 方站点生成的其余数据一起发送回您的响应脚本。您可以使用此变量将用户的会话连接到您稍后收到的服务器端请求(例如,您可以创建一个关联这两个值的数据库)。或者,您可以“欺骗”系统。如果您每次都将响应脚本位置与您的请求一起传递,则可以在其中构建自己的传递变量。所以而不是像

<responseURL>www.mysite.com/response.php</responseURL>

你可以发送

<responseURL>www.mysite.com/response.php?key=abcd1234</responseURL>

我建议直接将 key 参数设置为会话 ID,因此您必须构建一些可以在两者之间转换的简单内容(如我上面提到的表格)。

【讨论】:

    【解决方案3】:

    首先,您需要在使用它之前启动一个会话。在将任何值分配给您的代码中的会话有效类型之前: session_start();不要忘记销毁/取消设置会话。希望它会工作

    【讨论】:

    • 一个问题的作者写道:“我在每个 php 文件的第一行调用了 session_start()。”
    • 您不会破坏会话。销毁和取消设置也不同
    【解决方案4】:

    使用具有某些指定过期时间的 cookie !它会运作良好。用一些代码更新了您的问题,以便编码人员可以对其进行调试!

    【讨论】:

      【解决方案5】:

      简短的回答是:找到 cookie!

      您可以在域或目录级别放松。请参阅session_set_cookie_params() 规范。

      第三部分呢? response.php 是从同一个浏览器还是从另一个 Web 应用程序请求的,所以它有相同的 cookie 吗?在我看来,没有。

      【讨论】:

        【解决方案6】:

        解决问题需要分析流程步骤,确定每次执行的位置

        如果第三方应用程序将自身调用到响应的 URL 并且不是重定向到客户端,则会话是不同的。

        例子:

        • 客户端导航到 start_process.php 并为客户端创建会话
        • start_process.php 调用第三方
        • 第三方应用调用 response.php 并为第三方创建会话

        检查会话 ID 是否由客户端 cookie 维护并在服务器中验证非常重要。启动进程的客户端和第三方是应用程序的不同“客户端”,拥有自己的会话。


        根据您的问题显示您可能正在做的图表示例。

        您可能无法直接从客户端调用第三方。在客户端调用您主机上的一个页面,该页面调用第三方并捕获响应(例如使用 curl)

        图表示例:

        【讨论】:

          猜你喜欢
          • 2021-08-13
          • 1970-01-01
          • 1970-01-01
          • 2019-05-27
          • 1970-01-01
          • 2012-03-09
          • 1970-01-01
          • 1970-01-01
          • 2016-07-15
          相关资源
          最近更新 更多