代码之家  ›  专栏  ›  技术社区  ›  Delan Azabani

没有cookies的PHP会话

  •  54
  • Delan Azabani  · 技术社区  · 14 年前

    有没有一种方法可以在PHP中启动持久会话而不需要放置会话cookie?是否有其他方法可以跨页面维护会话,例如基于IP地址的解决方案?

    我问这个问题的原因是,虽然大多数用户都有cookie,但我想看看是否有办法让登录系统为那些禁用了cookie的用户工作(尽管我个人认为禁用cookie只是不必要的偏执)。

    7 回复  |  直到 14 年前
        1
  •  61
  •   AbsoluteƵERØ    7 年前

    我认为要求你的用户启用cookies并不过分。我觉得人们完全把它们关掉是很愚蠢的。

    session.use_only_cookies 设置为“0”以强制将会话ID附加到php中的URL。然而,这种方法有几个缺点。主要是将状态保存在URL中,而不是Cookie头。如果一个用户要复制并粘贴他们所在页面的URL,而其他人要单击它,那么他们将使用同一个会话。

    <?php
         ini_set("session.use_cookies", 0);
         ini_set("session.use_only_cookies", 0);
         ini_set("session.use_trans_sid", 1);
         ini_set("session.cache_limiter", "");
         session_start();
    
        2
  •  6
  •   halfdan    14 年前

    session.use_trans_sid 为true以激活将会话id附加到每个URL。看一看 this .

        3
  •  3
  •   Sliq    11 年前

    您可以使用URL中的会话ID,并通过以下方式禁用Cookie:

    ini_set('session.use_cookies', 0);
    ini_set('session.use_only_cookies', 0);
    ini_set('session.use_trans_sid', 1);
    session_start();
    // IP check
    if($_SESSION['ip_check'] != $_SERVER['REMOTE_ADDR']){
       session_regenerate_id();
       session_destroy();
       session_start();
    }
    $_SESSION['ip_check'] = $_SERVER['REMOTE_ADDR'];
    // session stuff
    

    http://php.net/manual/en/function.session-set-save-handler.php )

        4
  •  0
  •   gedq    8 年前

    您可以创建一个数据库记录或临时文件并检查 $_SERVER 在每个页面加载时,都会根据请求进行VAR。这是一个安全风险,但有足够的变量(看看列表) here

        5
  •  0
  •   T30    8 年前

    您可以将每个IP的会话id保存在数据库中:

    然后根据这个新表生成一个代码来管理会话行为!

    之后 session_start()

    session_id($in_table_session_id);
    

    有关更多信息和完整指南,请参阅: https://gist.github.com/mimrahe/77415f4a9e238c313bbe8c42f8a6b7fe

        6
  •  0
  •   jonjbar    6 年前

    如果我想这样做,那么我将在HTML代码中添加会话id作为注释标记,并使用和配置PHP代码以使用HTML代码中包含的会话id。我认为这样做比使用用户IP或在URL中添加会话id更重要。

        7
  •  0
  •   Oliver Williams    6 年前

    正确答案是否定的。除了cookie之外,使用任何变量组合都是不安全的。

    想想看:当用户第一次请求一个页面时,服务器会发送一个唯一的值,上面写着“HTTP是无状态的,保留这个,这样下次调用时我就知道是‘you’”。这意味着,那个人,在那个浏览器中(不管标签),在那个时候运行,有一个唯一的令牌。

    如果且仅当他们成功登录时,该令牌现在可以绑定到服务器端的会话。代币被认为是如此之长和随机,以至于没有人能及时猜到一个。

    多个浏览器可能使用相同的IP地址。多个人可以拥有完全相同的用户代理。cookie是唯一有效的存储系统。

    实际上还有一种方法,那就是将唯一令牌添加到 回到服务器的每个链接 以及所有AJAX调用,比如 ?PHPSESSID=my-unique-token-189481958 -但这是一个痛苦的代码。

        8
  •  0
  •   catiadesign    3 年前

    我已经进去了索引.php这样的东西总是会生成一个新的会话id 如果条件未验证,则基于时间和旧会话id。

    if ($_SESSION['id'] != $row['session'] || time() > $row['sessiontime']) {
        session_destroy();
        session_start();
        session_regenerate_id();
    }
        
    $_SESSION['id'] = session_id();
    

    在登录窗口中,我从$\u Session['id']变量中读取会话id,然后增加时间并将两者发送到数据库。