代码之家  ›  专栏  ›  技术社区  ›  3x071c

[PHP cURL]:会话cookies未保存?

  •  0
  • 3x071c  · 技术社区  · 7 年前

    我扩展了一个php脚本,它检查javascript是否在第二次(当js似乎关闭时)后停止重新加载。 Here is a link to the original php script by erm3nda . 正如在他的代码片段中看到的那样,第一次加载页面时,脚本(而且是“调用者”)将带有jquery ajax请求的脚本标记打印到同一页面,但是带有 $_GET header,它被后台加载的同一页捕获(进一步称为“脚本”),并设置 $_SESSION 变量为1。在被调用的脚本在后台完成其工作之后,调用者重新加载(并再次响应这个ajax查询),直到能够找到一个相同的名称 $\u会话 变量设置为1。如果不是,则在重新加载过程中,它将以“javascript is disabled”退出,如果设置为1,则以“javascript is enabled”退出。我开始修改这段代码,在页面已经重新加载一次之后,就不再重新加载了。因此,我目前正在使用此脚本:

    测试.php

    <html><body><?php
    header('Content-Type: text/html; charset=utf-8');
    ini_set('display_errors', 1);
    ini_set('log_errors',1);
    ini_set('display_startup_errors', 1);
    ini_set('error_reporting', E_ALL);
    error_reporting(E_ALL);
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    function start_session() {
      if(version_compare(phpversion(), "5.4.0") != -1){
        if (session_status() == PHP_SESSION_NONE) {
          session_start();
        }
      } else {
        if(session_id() == '') {
          session_start();
        }
      }
    }
    start_session();
    if (!isset($_SESSION['js']) && !isset($_REQUEST['sessionstart']) && !isset($_REQUEST['setjsoff']) && !isset($_SESSION['jsoff'])) {
      echo '<script src="./js/jquery.js"></script><script type="text/javascript">$(document).ready(function(){$.get(document.URL.substring() + "?sessionstart=1");});</script>';
    }
    if (isset($_REQUEST['sessionstart'])) {
      $_SESSION['js'] = 1;
      exit("in sessionstart mode");
    } else {
      if (isset($_REQUEST['setjsoff'])) {
        $_SESSION['jsoff'] = 1;
        if ($_SESSION['jsoff'] == 1) {
          exit("in setjsoff mode (success)");
        } else {
          exit("jsoff unsuccessful");
        }
      } else {
        session_destroy();
      }
    }
    if (!isset($_SESSION['js'])) {
      if (!isset($_SESSION['jsoff'])) {
        if (!isset($_REQUEST['sessionstart'])) {
          $ch = curl_init();
          $username = "***";
          $password = "***";
          curl_setopt($ch, CURLOPT_URL, "***/test.php?setjsoff=1");
          curl_setopt($ch, CURLOPT_HEADER, true);
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
          curl_setopt($ch, CURLOPT_FORBID_REUSE, true);
          curl_setopt($ch, CURLOPT_HTTPGET, true);
          curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
          curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
          $chout = curl_exec($ch);
          curl_close($ch);
          echo "curl init - ".$chout." - ";
        }
        header("Refresh: 1");
        exit("301 Redirect");
      }
      echo "Javascript is not enabled";
    } else {
      echo "Javascript is enabled";
    }
    ?></body></html>
    

    *** )

    启用javascript后,这个脚本当前的功能应该是:加载、重新加载一次,然后调用者输出“javascript已启用”。
    curl init - HTTP/1.1 200 OK Date: *** GMT Server: Apache X-Powered-By: PHP/5.6.36 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Set-Cookie: PHPSESSID=***; path=/ Transfer-Encoding: chunked Content-Type: text/html; charset=utf-8 in setjsoff mode (success) - 301 Redirect ".

    *** )

    如您所见,输出分为3部分:
    - curl init 表示curl已启动(不输出错误)
    the header information of the called page via curl + output of that page
    - 301 redirect 表示页面已完全执行并将要重新加载

    in setjsoff mode (success) (这意味着 $_SESSION['js'] 到1)和非常多的标题信息,我无法解释。
    这(最后)是我的问题 :页面随后继续重新加载(因此会话变量不知何故丢失了?)。标题信息是否显示任何问题,或者我是否忘记通过设置基本选项 curl_setopt ?

    1 回复  |  直到 7 年前
        1
  •  1
  •   user268396    7 年前

    基本问题是你 实际上是在重新加载页面。你可能导致 服务器 浏览到同一页,但这是一个与触发它的原始客户端会话完全不同的会话。此外,您没有为curl指定cookiejar,因此即使您 能够 设法从中恢复,您的会话和来自服务器调用的关联cookie将丢失。

    然而,第一个问题是根本问题:你试图做一些你甚至不应该考虑的事情。幸运的是,HTML规范为您提供了 <noscript> 可以使用的元素。

    所以只要发射出这样的东西:

    <script type="text/javascript">/*<![CDATA[*/ 
    /* JS code goes here  */ 
    /*]]>*/</script>
    <noscript>
      <!--
        - hit a PHP endpoint that returns a static resource you can hide
        - that PHP script can adjust the session as necessary.
       -->
      <img src="/dummy/image/script.php?jsoff=1" 
           style="width:0px!important;height:0px!important;">
    </noscript>
    

    更妙的是:为什么不简单地假设没有可用的JavaScript,然后在遇到单独的PHP脚本时重新考虑这个问题呢?然后您可以简单地链接一个静态 <script> 中的资源 <head> 页面的。。。一个更简单、更强大的解决方案。