是否可以阻止使用 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 代码来提出这个问题。
基本上它使用defineGetter
和defineSetter
方法设置页面上的所有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?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用纯 CSS/HTML 而没有 JavaScript 来实现 GDPR Cookie 同意?不希望脚本阻止程序阻止它