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

时间:2012-04-24 21:28:03

标签: php javascript cookies blocking

很多人可能都知道新的欧盟隐私法,但对于那些没有的人来说,它基本上意味着没有一个由欧盟居民经营的网站可以设置被视为“非必要的运营除非获得明确许可,否则该网站将在访客计算机上使用。

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

浏览器显然能够阻止内置于其中的特定网站的cookie。我的问题是,有没有办法使用JS或PHP做类似的事情?

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

显然可以在设置完成后删除所有cookie,但是虽然这相当于不允许首先设置它们,但我猜这在这种情况下不够好,因为它不遵守法律条文。

想法?

5 个答案:

答案 0 :(得分:12)

我对这个答案也很感兴趣。我已经完成了我需要在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() {} );
}

答案 1 :(得分:10)

我从这里改编了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

您可以使用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; } );

}

}

答案 2 :(得分:2)

您无法完全停用它,但可以使用.htaccess

覆盖默认设置

尝试

 SetEnv session.use_cookies='0';

如果某些用户可选,请不要使用.htaccess

if(!$isAuth)
{
    ini_set('session.use_cookies', '0');
}

答案 3 :(得分:0)

有点老,但我认为您应该得到一个可行的答案:

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

第2步:显示Cookie标语。

第3步:等到用户接受后,您就可以执行第三方脚本代码了。

为我工作。

答案 4 :(得分:-2)

not paying attention to hoaxes怎么样?

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