【问题标题】:Ajax Call enforce new SessionID from PHPAjax 调用从 PHP 强制执行新的 SessionID
【发布时间】:2018-10-08 12:36:06
【问题描述】:

我有两个 PHP 文件。

第一个:http://huntinggrounds.de/test/sessionToken.php 通过 session_start() 打开一个新会话并具有变量 $_SESSION['token'] = "123";

通过获取(ajax 调用)到我的第二个文件(formTest.php),我想返回这个 $_SESSION['token']。 但这总是不再有效。

我检测到我总是得到一个新的 SessionID。什么是绝对错误的。

如果我通过浏览器拨打http://huntinggrounds.de/test/formTest.php direkt。一切都是正确的。所以问题一定是ajax调用。

以下是来源: 在启动文件 sessionToken.php 中:

fetch(form.getAttribute("action"), {
        method: 'POST',
        headers: {
            'x-csrf-token': token,
            'Accept': 'application/json, text/plain, */*',
            'credentials': 'include'     
        },
        body: data      
 })

我的 PHP 文件 formTest.php

    <?php
    //session_id('joe');
    //session_start();
    if (session_status()==1) {
        session_start();  $sessionStart = "sessionNEU";
    }

    header('Access-Control-Allow-Methods: POST');
    header("X-Powered-By: joe");

    header("Access-Control-Allow-Headers: x-csrf-token, X-Requested-With"); 
    header("Access-Control-Expose-Headers: x-csrf-token");

    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Allow-Origin: *');
    header($_SERVER["SERVER_PROTOCOL"]." 200 Ok");
    header('Content-type: application/json');

    $response= array();
        $tokenNeu = generateToken(16);
    //$tokenAlt = $_SERVER['HTTP_X_CSRF_TOKEN'];
    $response["session"]["ID"] = session_id();
    $response["session"]["savePath"] = session_save_path();
    $response["session"]["startsNew"] = $sessionStart ? "yes" : "no";
    $response["session"]["hasToken"] = isset($_SESSION['token']) ? "yes" : "no";
    $response["session"]["token"] = $_SESSION['token'];
    $response["session"]["tokenValid"] = ($_SESSION['token'] == $_SERVER['HTTP_X_CSRF_TOKEN']) ? "valid" : "invalid";
    $response["session"]["tokenCSFR"] = $_SERVER['HTTP_X_CSRF_TOKEN'];
    $response["session"]["tokenNew"] = $tokenNeu;
echo json_encode($response);...  

知道是什么迫使 testForm.php 提供新的 SessionID。

(当我在两个文件中设置 session_id('joe'); 它就像一个魅力)

请不要评论 session_start();必须在第一行。这是经过测试但失败了。

我正在使用 PHP7。

【问题讨论】:

    标签: javascript php ajax fetch fetch-api


    【解决方案1】:

    您需要将凭据放在选项中而不是标题中,请参阅:http://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch

    fetch(form.getAttribute("action"), {
            method: 'POST',
            headers: {
                'x-csrf-token': token,
                'Accept': 'application/json, text/plain, */*'
            },
            'credentials': 'include',
            body: data      
     })
    

    【讨论】:

    • 那个东西。我不会使用不同的 sessionID。
    • @hamburger 你想要不同的cookie名称而不是服务器上的值和不同的会话?
    • 不,我什么都不想要。我希望在两个调用中使用相同的 SessionID。
    • @hamburger 如果你没有 session_id 但添加它时它不起作用?
    • 我上面的示例不起作用,因为两个文件的 sessionID 不同。如果我用 session_id('joe'); 设置 ID在这两个文件中它都有效。但这不是解决方案。
    猜你喜欢
    • 2013-08-08
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 2018-03-16
    • 1970-01-01
    相关资源
    最近更新 更多