zoukankan      html  css  js  c++  java
  • php 会话控制(禁用cookie后session为什么会失效?)

    首先说明一点:session不一定必须依赖cookie,只是php默认客户端sessionid基于cookie方式保存。

    到此,我想你也应该了解了php默认的session客户端保存方式是基于cookie的,所以一旦客户端禁用Cookie,那么session跨页将会失效,不知道这么描述是否合适,通俗的说无状态的东西要变的有状态,只能两边都进行比对,如果用cookie方式保存的SessionID,客户端这边的比对条件就放到cookie里,所以客户端禁用cookie,session便也会随之失效。php的session客户端ID一般有两种保存方式:cookie和url方式。如果是cookie中保存session ID,就可以看到浏览器的cookie中有一个PHPSESID变量(可以通过firefox查看)。如果是URL传递的(建议使用隐藏表单传递),就可以看到形如:index.php?PHPSESID=ves0d7uvdsab9k6sig73mnn592的URL。

    demo1.php
    <?php
    session_start();
    $_SESSION['blog']='http://blog.jb51.net';
    echo "<a href='demo2.php'>test2</a>";
    ?>

    demo2.php
    <?php
    session_start();
    echo 'session值为'.$_SESSION['blog'];
    ?>

      运行上面的代码,在客户端cookie正常情况下,我么可以在demo2.php中打印出$_SESSION['blog']的值为:http://blog.jb51.net。但是,现在如果你手动禁用客户端的cookie,再运行该实例,可能就得不到结果了。因为默认的客户端sessionid保存方式在跨页后读取不到前一页的sessionid,当执行session_start();将又会产生一个session文件,与之对应产生相应的session id,用这个session id是取不出前面提到的第一个session文件中的变量的,因为这个session id不是打开它的“钥匙”。如果在session_start();之前加代码session_id($sessionid);将不产生新的session文件,直接读取与这个id对应的session文件。简单的说就是在前一页取得session id,然后想办法传递到下一页,在下一页的session_start();代码之前加代码session_id(传过来的sessionid)

    demo.php
    <?php
    $sid = $_GET['sid'];
    if(!empty($sid)){
      session_id($sid);
      session_start();
    }else{
      session_start();
      $sid = session_id();
    }
    ?>
    <form action="demo2.php?sid=<?php echo $sid ?>" method="post">
    <input type="text" name="id" value="100" />
    <input type="submit" value="提交"/>
    </form>

    demo2.php
    <?php
    $sid = $_GET['sid'];
    if(!empty($sid)){
      session_id($sid);
      session_start();
    }else{
      session_start();
      $sid = session_id();
    }
    $id = $_POST['id'];
    $key = 'poll_'.$id;
    if($id!=''){
      echo $key = 'poll'.$id;
      if(!empty($_SESSION[$key])){
        $_SESSION[$key]=$_SESSION[$key] + 1;
      }else{
        $_SESSION[$key]=1;
        setcookie($key ,$id+1,time()+3600*24);
      }
      echo '<script>alert("success");javascript:location.href="demo.php?sid='.$sid.'";</script>';
    }else{
      echo '<script>alert("failed!ID Null");javascript:history.back(-1);</script>';
    }
    ?>

    除此之外,我们还可以将客户端PHPSESID存放到文件中,如:

    demo.php
    session_start();
    $_SESSION['blogdomain']= 'http://blog.jb51.net';
    $sid=session_id();
    $fp=fopen("D: mpwebsid.txt","w+");
    fwrite($fp,$sid);
    fclose($fp);
    echo '<a href="demo2.php">demo2</a>';

    demo2.php
    $fp=fopen("D: mpwebsid.txt","r");
    $sid=fread($fp,1024);
    fclose($fp);
    session_id($sid);
    session_start();
    print_r($_SESSION);

    当客户端禁用cookie,可以通过以下几种方式改变session对客户端cookie的依赖,使session抛开客户端cookie:

        设置php.ini中的session.use_trans_sid = 1或者编译时打开了--enable-trans-sid选项,让PHP自动跨页传递session id。当session.use_trans_sid为有效时,session.use_only_cookies一定要设置为无效0。

        手动通过URL传值、隐藏表单传递session id。

        用文件、数据库等形式保存session_id,在跨页过程中手动调用。

        改变session客户端ID保存方式:

          session.use_cookies //控制客户端保存SessionID时使用哪一种方式,当它为“1”时,就说明启动了session cookie(初始值为1)

          可以使用上面我们提到的函数来查询得到目前的session id:echo $_COOKIE["PHPSESSID"];

          但是,如果client的浏览器不支持cookie的话,即使session.use_cookies这个参数的值等于“1”,用上述的查询也只会得到null。

          php.ini中两个和该选项相关的配置参数:

            session.use_cookies = 1  //是否使用cookies(默认值为1)
            session.use_only_cookies=1  //为1时只使用cookie;为0时可使用cookie和其它方式,这时如果客户端cookie可用,则session还是默认用cookie(默认值为1)

          注意:如果客户的浏览器是支持cookie的,强烈推荐“session.use_only_cookies = 1”,当session.use_only_cookies为有效时,即使想通过URL来传递session id也会被认为无效,这样可以减少通过sessionid被攻击的可能性

          在php代码页面中设置方式:

                ini_set('session.use_cookies','1');
              ini_set('session.use_only_cookies','1');       

          

  • 相关阅读:
    tp6 控制器不存在:appindexcontrollerIndex
    thinkphp助手函数
    thinkphp5.1、thinkphp6
    lnmp安装
    关于像秒杀这种高并发场景的解决方案
    C# 基于hslcommunication的异步,同步,一对多,webapi等跨程序网络框架实现,适用程序-程序通信
    C# 调用Python脚本 python脚本反调用C#方法 python脚本调用另一个脚本
    C# webapi服务器,创建自定义的,简单的web服务器,供远程接口调用
    C# 创建mqtt服务器,mqtt发布数据,验证逻辑
    C# 实现 websocket 服务器 发送客户端网页前端数据,C#和网页前端通信
  • 原文地址:https://www.cnblogs.com/lijiageng/p/6900413.html
Copyright © 2011-2022 走看看