是否可以阻止使用 Javascript 或 PHP 设置 cookie?

Posted

技术标签:

【中文标题】是否可以阻止使用 Javascript 或 PHP 设置 cookie?【英文标题】:Is it possible to block cookies from being set using Javascript or PHP? 【发布时间】:2012-05-05 13:58:23 【问题描述】:

你们中的很多人可能都知道新的欧盟隐私法,但对于那些不知道的人来说,这基本上意味着欧盟居民公司运营的任何网站都不能设置归类为“对除非获得明确许可,否则该网站在访问者机器上。

那么,问题就变成了如何最好地处理这个问题?

浏览器显然有能力阻止来自内置于它们的特定网站的 cookie。我的问题是,有没有办法使用 JS 或 php 做类似的事情?

即拦截任何可能试图设置的 cookie(包括第 3 方 cookie,如 Analytics 或 Facebook),并阻止它们,除非用户同意。

显然,一旦设置了所有 cookie,就可以删除它们,但是尽管这与一开始就不允许设置它们是一样的,但我猜在这种情况下它还不够好,因为它不遵守法律条文。

想法?

【问题讨论】:

你不能。就这么简单。例如,您的 Analytics cookie 可能来自您无法控制的其他主机(例如 analytics.google.com)。关于您自己的 cookie,您可以在设置它们之后再次取消设置它们,但这...并没有任何意义——除非您谈论的是在您的主机上运行的第三方软件。 声明欧盟可以将cookies归类为“对网站运行非必要”是不正确的。 GDPR 指令:首先是技术中立的,其次它仅适用于自然人的个人数据。因此,如果使用名为“cookies”的技术来处理可以识别自然人的数据,那么对于“cookies”的这种特殊用途,必须征得同意。例如,如果我们使用“cookies”来跟踪用户会话,但服务器不包含可以识别用户背后自然人的数据,则不需要同意。 JS 解决方案:***.com/a/33064438/2068362 【参考方案1】:

有点老了,但我认为你应该得到一个有效的答案:

第 1 步:不要执行第三方脚本代码。

第 2 步:显示 cookie 横幅。

第三步:等到用户接受,现在就可以执行第三方脚本代码了..

为我工作。

【讨论】:

【参考方案2】:

我从这里改编了 Michaels 代码来提出这个问题。

基本上它使用defineGetterdefineSetter 方法设置页面上的所有cookie,然后删除用户指定的cookie,如果这是您的目标,这个角色当然也可以反转。

我已经使用第三方 cookie(例如 Google Analytics)对此进行了测试,它似乎运行良好(不包括 __utmb cookie 意味着我不再在 Google Analytics 中被选中),也许您可​​以使用它并使其适应您的具体需求。

我已经包含了关于如果 cookie 名称不是 __utmb 的部分供您参考,尽管您可以轻松地从数组中获取这些值并以这种方式循环。

基本上这个函数将包括除了那些在声明if( cookie_name.trim() != '__utmb' ) all_cookies = all_cookies + cookies[i] + ";"; 的部分中指定的cookie之外的所有cookie

您可以使用 OR 或 AND 过滤器添加此内容,或从数组、数据库、用户输入或任何您喜欢排除特定内容的内容中提取(用于确定必要和非必要 cookie)。

function deleteSpecificCookies() 

var cookies = document.cookie.split(";");
var all_cookies = '';

    for (var i = 0; i < cookies.length; i++) 

        var cookie_name  = cookies[i].split("=")[0];
        var cookie_value = cookies[i].split("=")[1];

        if( cookie_name.trim() != '__utmb' )  all_cookies = all_cookies + cookies[i] + ";"; 


    

if(!document.__defineGetter__) 

    Object.defineProperty(document, 'cookie', 
        get: function()return all_cookies; ,
        set: function()return true,
    );

 else 

    document.__defineGetter__("cookie", function()  return all_cookies;  );
    document.__defineSetter__("cookie", function()  return true;  );




【讨论】:

您是如何测试 GA 等第三方 cookie 是否被阻止的?我似乎无法仅通过 GA 调试来区分。 document.cookie【参考方案3】:

我也对这个答案很感兴趣。我已经完成了我需要在 PHP 中完成的任务,但 javascript 组件仍然让我望而却步。

这是我在 PHP 中的做法:

$dirty = false;
foreach(headers_list() as $header) 
    if($dirty) continue; // I already know it needs to be cleaned
    if(preg_match('/Set-Cookie/',$header)) $dirty = true;

if($dirty) 
    $phpversion = explode('.',phpversion());
    if($phpversion[1] >= 3) 
        header_remove('Set-Cookie'); // php 5.3
     else 
        header('Set-Cookie:'); // php 5.2
            

然后我有一些额外的代码可以在用户接受 cookie 时关闭它。

问题是我的网站中使用了第三方插件,它们通过 javascript 操作 cookie,并且没有通过扫描来确定哪些插件访问 document.cookie - 他们仍然可以设置 cookie。

如果他们都使用相同的框架会很方便,所以我可以覆盖 setCookie 函数 - 但他们没有。

如果我可以删除或禁用 document.cookie 以使其无法访问,那就太好了...

编辑: 可以阻止 javascript 访问以获取或设置 cookie。

document.__defineGetter__("cookie", function()  return ''; );
document.__defineSetter__("cookie", function()  );

编辑 2: 为此在 IE 中工作:

if(!document.__defineGetter__) 
    Object.defineProperty(document, 'cookie', 
        get: function()return '',
        set: function()return true,
    );
 else 
    document.__defineGetter__("cookie", function()  return ''; );
    document.__defineSetter__("cookie", function()  );

【讨论】:

有没有办法通过 JavaScript 仅阻止特定的 cookie? 您必须将本机 cookie 函数移动到另一个函数名称,然后重写 cookie 函数以检查内容,然后再拒绝 cookie 或将其发送到新的 cookie 函数。我什至不确定将本机功能移动到其他地方是否会或可以工作......【参考方案4】:

你不能完全禁用它,但你可以用.htaccess覆盖默认设置

试试

 SetEnv session.use_cookies='0';

如果它对某些用户是可选的,请不要使用.htaccess

if(!$isAuth)

    ini_set('session.use_cookies', '0');

【讨论】:

没有考虑过 .htaccess - 但是,如果我是对的:1. 这将适用于每个用户和 2:如果获得许可,就没有办法允许 cookie? 你是对的..我可以更新答案以包含可选权限 有趣的方法...这是否会阻止设置第 3 方 cookie(即谷歌分析)? 此方法只停止会话cookie,而不是其他cookie(包括3rd 方cookie)或javascript cookie(包括3rd 方javascript cookie)。 "此方法仅停止会话 cookie" - 此方法仅停止内置会话处理程序设置 cookie,它不会停止“会话 cookie”(或任何其他 cookie)。代码仍然可以调用 setcookie() 来设置 session cookie。另外,在.htaccess 中调用SetEnv 来设置一个名为session.use_cookies环境变量 与PHP 的session.use_cookies 配置选项无关。【参考方案5】:

not paying attention to hoaxes怎么样?

除了这是旧闻之外,文字清楚地表明它仅适用于对网站功能不是必不可少的 cookie。这意味着会话 cookie、购物篮或任何与使网站正常工作直接相关的东西都非常好。未经许可,任何其他内容(跟踪、统计等)都是“不允许的”。

【讨论】:

阻止设置 Google(或除您自己之外的任何其他人)的 cookie 不是您的责任。 但这就是确切的一点——现在在欧盟就是这样,该法律将于今年 5 月 25 日开始执行。任何选择托管第 3 方 cookie 的网站都有责任向用户解释他们所做的事情,并为他们提供阻止这些 cookie 的选项。 Binning Analytics 等显然不是一个可行的选择,所以我正在寻找其他一些技术 这是你的责任。

以上是关于是否可以阻止使用 Javascript 或 PHP 设置 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止、停止或终止 Javascript 函数?

是否可以使用纯 CSS/HTML 而没有 JavaScript 来实现 GDPR Cookie 同意?不希望脚本阻止程序阻止它

PHP是不是阻止了粘性位?

如何检查网站是不是缺少阻止内容类型嗅探的标题

如何检查 Flash 插件在 Chrome 中是不是被阻止

想要阻止MongoDB或JavaScript脚本执行