【问题标题】:PHP opens 2nd session unwantedPHP 打开不需要的第二个会话
【发布时间】:2019-10-14 23:00:52
【问题描述】:

要求:使用QRBOT-app扫描手机上的条码,并将扫描的号码提供给网站。 问题:我打开了一个会话 (1),从这里我打开应用程序(请参阅 ScanBardcode.php),我扫描并且应用程序返回到包含所需参数的回调 URL。但是我确实希望它会重新使用它的会话,它会创建一个新的会话 (2)。有人能帮我吗?它确实有两个会话都处于活动状态,并且两个页面都继续使用它自己的会话。我只能在我的手机上测试它,我检查过每次都在使用它(initial-1和callback-2是同一个浏览器) 我已经尝试过的: 1.在回调URL中传递sessionID(QRBOT不允许参数) 2.设置Session.auto_start为1

ScanBarcode.php

<?php
   include_once('../../config.inc.php'); //contains DB connection details and other settings
   include_once($fullurl . '../../admin/includes/sessie.inc.php'); //generates session
    echo "SessionID=". session_id() . "!";
    $_SESSION['BarCode'] = "VoorraadTellen";
    echo "Wat gaan we doen? " . $_SESSION['BarCode'] . "</br></br>";
  //URL to open qrbot.
    echo "<a href=https://qrbot.net/x-callback-url/scan?x-success=https%3A%2F%2Filonashairstyling.nl/2016UAT/module/Ilonas_admin/ScanBarcodeCallBack.php?".">click</a>"
?>

ScanBarcodeCallBack.php

    <?php
     $source = $_GET['x-source'];
     $content = $_GET['content'];
     $format = $_GET['format'];
     include_once('../../config.inc.php');
     include_once($fullurl . '../../admin/includes/sessie.inc.php'); 
     echo "Wat gaan we doen? " . $_SESSION['BarCode'] . "</br></br>";
     echo "SessionID=". session_id() . "!";
     echo $source . $content . $format;

  // HERE I WRITE TO THE DB.
    ?>

sessie.inc.php

<?php
$a = session_id();
if(empty($a)) 
    {
        session_start();
    }

    if(isset($_SESSION['sgebruiker'])) 
    {
        $now = time();
        if($now - $_SESSION['stijd'] > $_SESSION['maxidle']) 
        {
            $_SESSION = array();
            session_destroy();
        } 
        else 
        {
            $_SESSION['stijd'] = $now;
        }
    } 
    elseif(isset($_COOKIE['login_cookie'])) 
        {
            //Check against db and set cookie.
        }
?>

当我在 URL 中添加 sessionId 作为参数时添加屏幕截图: enter image description here

更新到 ScanBarcode.php

`echo "<a href=https://qrbot.net/x-callback-url/scan?x-success=https%3A%2F%2Filonashairstyling.nl/2016UAT/module/Ilonas_admin`/ScanBarcodeCallBack.php?s=".htmlspecialchars(session_id()).">click</a>"

【问题讨论】:

  • 会话与特定应用程序相关联。浏览器和 QRBOT 应用程序都有自己的会话 cookie。
  • @Barmar 感谢您的回复。你有什么建议可以解决这个问题吗?
  • 我认为将会话 ID 作为 URL 参数传递应该可以。展示你是如何尝试这样做的。这是documentation
  • @Barmar 我已将 Barcode.php 中的 URL 更新为回显“qrbot.net/x-callback-url/…>”。当我运行测试时,我在应用程序中收到错误(看起来它正在尝试添加两次参数)
  • 将代码放入问题中,以便正确格式化。

标签: php session session-cookies


【解决方案1】:

据我所知,您不需要使用session_id() 进行全面检查。 session_start() 的 PHP 文档说:

session_start() 根据通过 GET 或 POST 请求或通过 cookie 传递的会话标识符创建会话或恢复当前会话

这也是我的经验。每次我使用session_start() 时,我只是将它放在每个文件的顶部(或者像你一样包含它)

【讨论】:

  • 感谢您的回复 - 我确实注释掉了一些会话文件并在没有检查的情况下放置了 session_start() 函数 - 如果打开它确实是现有会话,但它没有解决我遇到的问题。
  • 对不起。我想我误解了这个问题。
  • 您是否尝试过像这样将会话 ID 添加到回调 URL: echo '';
  • 这解决了问题 - 我将清理代码并将其作为答案发布。 @Tsia
【解决方案2】:

在URL中传递会话ID时,需要在调用session_start()之前使用参数设置会话ID。将sessie.inc.php 更改为:

<?php
if (isset($_GET['s'])) {
    session_id($_GET['s']);
}
session_start();

if(isset($_SESSION['sgebruiker'])) 
{
    $now = time();
    if($now - $_SESSION['stijd'] > $_SESSION['maxidle']) 
    {
        $_SESSION = array();
        session_destroy();
    } 
    else 
    {
        $_SESSION['stijd'] = $now;
    }
} 
elseif(isset($_COOKIE['login_cookie'])) 
{
    //Check against db and set cookie.
}
?>

【讨论】:

    【解决方案3】:

    通过与@Tsai 和@Barmar 合作,我们找到了解决方案。 我们通过以下方式修复它: - 使用 urlencode-function 对 URL 进行编码 - 从 URL 中获取 sessionID 并在启动 start_session (see also) 之前使用 session_id-function 应用它。

    下面的清理代码;希望有人也可以使用它。

    ScanBarcode.php

    <?php
       include_once('../../config.inc.php'); //contains DB connection details and other settings
       include_once($fullurl . '../../admin/includes/sessie.inc.php'); //generates session
        echo "SessionID=". session_id();
      //URL to open qrbot.
    $CallbackUrl = "http://ilonashairstyling.nl/2016UAT/module/Ilonas_admin/ScanBarcodeCallBack.php?s=" . htmlspecialchars(session_id());
    echo "<a href=https://qrbot.net/x-callback-url/scan?x-success=". urlencode($CallbackUrl) . ">click</a>"
    ?>
    

    ScanBarcodeCallBack.php

    <?php
      $source = $_GET['x-source'];
      $content = $_GET['content'];
      $format = $_GET['format'];
    
      include_once('../../config.inc.php');
    
      ini_set("session.use_cookies",0);
      ini_set("session.use_trans_sid",1);
      session_id($_GET['s']);
      //print_r($_SESSION); //You can test it with this code
      //print(session_id()); //You can test it with this code
    
      ini_set("session.use_cookies",1);
      ini_set("session.use_trans_sid",0);
    
      include_once($fullurl . '../../admin/includes/sessie.inc.php'); 
    
      echo "Wat gaan we doen? " . $_SESSION['BarCode'] . "</br></br>";
      echo "SessionID=". session_id() . "!";
      echo $source . $content . $format;
    
      // HERE I WRITE TO THE DB.
    ?>
    

    sessie.inc.php 不变

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      相关资源
      最近更新 更多