检查是否启用了cookie而未在PHP中设置GET参数或会话

时间:2013-02-21 11:42:30

标签: php cookies

Detect if cookies are enabled in PHPCheck if cookies are enabled中提出的问题非常相似,我想知道是否启用了Cookie。

然而,我试图让用户尽可能透明,因此我对我的网址附加一些“cookietest = 1”参数不感兴趣。

我知道我可以重定向回用户最初输入的页面,取消设置“cookietest = 1”GET参数,如果通过会话禁用cookie,只需告诉原始页面,但是......

我目前正在使用CodeIgniter并且不想搞乱CodeIgniter会话,因此不使用PHP会话来存储cookie启用/禁用状态。

我实际上不确定使用PHP会话是否会弄乱CodeIgniter会话,但即使它不是,我仍然有兴趣知道是否有一些巧妙的解决方案,那可以在没有设置的情况下进行cookie检查一个GET参数或使用会话(但重定向很好)?

更新

似乎我需要澄清一点:

我想知道Cookie是否已启用客户端。我已经尝试过我所链接的问题中描述的方法,即:

  1. 设置Cookie。
  2. 重定向到检查Cookie PHP页面或带有“cookietest = 1”GET参数的同一页面。
  3. 查看Cookie是否仍然设置:如果是=>万岁,饼干正在运作!,否则=>嘘,饼干被禁用。
  4. 我要问的是,是否可以在不设置GET参数的情况下执行此操作(因为这在URL中可见)。这个问题的答案是“是的,如果你使用PHP会话”。

    我的下一个问题是:如果不使用PHP会话,是否可以不设置GET参数?

4 个答案:

答案 0 :(得分:1)

基础知识:在您向客户端发送一个cookie并从中回复之前,您无法知道用户是否启用了Cookie。

所以流程:

  • 客户请求
  • 服务器响应(+ cookie)
  • 客户请求(+ cookie)
无法以任何方式避免

您可以使用某些测试请求(ajax,图像等)跟踪是否启用了Cookie

例如,您可以使用简单的1px图像或从您的php脚本提供的任何徽标图像,您可以跟踪是否启用了Cookie。

现在流程是:

  • 客户请求
  • 服务器响应HTML(+ cookie)
  • 客户请求远程页面资源(js,img,css)(+ cookie)
  • 请求页面资源的服务器响应

这样的东西
<?php 
    // domain.com/some.js
    if (isset($_COOKIE['test']))
         $_SESSION['cookies_enabled'] = true;

    echo <<JS
    <someJS code or nothing>
    JS;
 ?>

答案 1 :(得分:1)

我刚才看了很多,似乎每个方面都有它的缺陷。我考虑的一件事是,如果用户要更新页面或通过后退按钮返回页面,cookie检查将如何工作。

显然,要让服务器查看客户端是否接受cookie,客户端必须在服务器尝试设置cookie之后再发送HTTP request,其中服务器会查找cookie标头,指示客户接受cookie(没有标头=不接受cookie)。这个额外的请求可以重定向到另一个页面(参见通常的方法,$_GET参数作为一个标志,说明是否发生了设置cookie的尝试)但重要的是它真的只是另一个HTTP请求。我最终做的是将整个页面包裹在HTML FRAMESET

<?php
    setcookie('test', 1, time() + 3600);
    echo '<HTML>
        <HEAD>
            <TITLE>
            </TITLE>
        </HEAD>
        <frameset rows="100%" cols="100%">
            <frame src="next.php">
        </frameset>
    </HTML>';
?>

...然后在HTTP request的附加next.php我知道如果客户已接受Cookie,请求中会包含Cookie标头,因此我不必使用$_GET参数作为指示此的标志。 Next.php因此看起来像:

<?php
    if(count($_COOKIE) > 0){
        //Set some variable that indicates to the rest of the script that cookies 
        //are enabled.
    }
    else {
        //Set some variable indicating that cookies are disabled
    }
    //Output the rest of the script and HTML code to be displayed
?>

我考虑过做同样的事情,但是从HTTP request标记而不是IMG发送了额外的FRAMESET但是我遇到了如何向父脚本指示的问题通过图像是否设置了cookie,因此我最终这样做了。我在这种方法中看到的唯一缺陷是,如果用户右键单击框架并选择仅更新框架(而不是整个页面),那么框架将错误地声明cookie被禁用但是与所有框架的缺点相比较其他方式,我认为这是可以接受的。

编辑:我还应该补充一点,我在没有Javascript的情况下做了这个。

答案 2 :(得分:0)

我会用php.ini设置找出这样的东西。 也许是这样的:

if (ini_get("session.use_cookies") == 1) {
  print "cookies enabled";
}

答案 3 :(得分:0)

虽然你可以检查php是否启用了cookie,但是一个非常简单的测试就是设置一个cookie,然后尝试阅读它。

如果你成功阅读它,它就有用了。 如果客户端不允许使用cookie,也会通知您。