检查是否启用第三方cookie

2023-11-22

我有一个应用程序需要检查客户端浏览器是否启用了第三方 cookie。有谁知道如何在 JavaScript 中做到这一点?


技术背景

第三方通过 HTTP(不是 JavaScript)设置和读取 cookie。

因此,我们需要向外部域发送两个请求来测试是否启用了第三方 cookie:

  1. 第三方设置 cookie 的一种方式
  2. 第二种,根据浏览器是否在第二个请求中将 cookie 发送回同一第三方,会产生不同的响应。

由于 DOM 安全模型,我们无法使用 XMLHTTPRequest (Ajax)。

显然你不能并行加载两个脚本,否则可能会发出第二个请求before第一个请求的响应返回,并且测试 cookie 将不会被设置。

代码示例

Given:

  1. The .html文件位于一个域中,并且

  2. The .js.php文件位于第二个域上,我们有:

HTML 测试页面

另存为third-party-cookies.html

<!DOCTYPE html>
<html>
<head id="head">
  <meta charset=utf-8 />
  <title>Test if Third-Party Cookies are Enabled</title>
<style type="text/css">
body {
  color: black;
  background: white none;
}
.error {
  color: #c00;
}
.loading {
  color: #888;
}
.hidden {
  display: none;
}
</style>
<script type="text/javascript">
window._3rd_party_test_step1_loaded = function(){
  // At this point, a third-party domain has now attempted to set a cookie (if all went to plan!)
  var step2Url = 'http://third-party.example.com/step2.js.php',
    resultsEl = document.getElementById('3rd_party_cookie_test_results'),
    step2El = document.createElement('script');

  // Update loading / results message
  resultsEl.innerHTML = 'Stage one complete, loading stage 2&hellip;';
  // And load the second part of the test (reading the cookie)
  step2El.setAttribute('src', step2Url);
  resultsEl.appendChild(step2El);
}
window._3rd_party_test_step2_loaded = function(cookieSuccess){
  var resultsEl = document.getElementById('3rd_party_cookie_test_results'),
    errorEl = document.getElementById('3rd_party_cookie_test_error');
  // Show message
  resultsEl.innerHTML = (cookieSuccess ? 'Third party cookies are <b>functioning</b> in your browser.' : 'Third party cookies appear to be <b>disabled</b>.');

  // Done, so remove loading class
  resultsEl.className = resultsEl.className.replace(/\bloading\b/,' ');
  // And remove error message
  errorEl.className = 'hidden';
}
</script>
</head>
<body id="thebody">

  <h1>Test if Third-Party Cookies are Enabled</h1>

  <p id="3rd_party_cookie_test_results" class='loading'>Testing&hellip;</p>
  <p id="3rd_party_cookie_test_error" class="error hidden">(If this message persists, the test could not be completed; we could not reach the third-party to test, or another error occurred.)</p>

  <script type="text/javascript">
  window.setTimeout(function(){
    var errorEl = document.getElementById('3rd_party_cookie_test_error');
    if(errorEl.className.match(/\berror\b/)) {
      // Show error message
      errorEl.className = errorEl.className.replace(/\bhidden\b/,' ');
    } else {
    }
  }, 7*1000); // 7 sec timeout
  </script>
  <script type="text/javascript" src="http://third-party.example.com/step1.js.php"></script>
</body>
</html>

第一个第三方 JavaScript 文件

另存为step1.js.php

这是用 PHP 编写的,因此我们可以在文件加载时设置 cookie。 (当然,它可以用任何语言编写,甚至可以在服务器配置文件中完成。)

<?php
  header('Content-Type: application/javascript; charset=UTF-8');
  // Set test cookie
  setcookie('third_party_c_t', 'hey there!', time() + 3600*24*2);
?>
window._3rd_party_test_step1_loaded();

第二个第三方 JavaScript 文件

另存为step2.js.php

这是用 PHP 编写的,因此我们可以在响应之前读取服务器端的 cookie。我们还清除 cookie,以便可以重复测试(如果您想搞乱浏览器设置并重试)。

<?php
  header('Content-Type: application/javascript; charset=UTF-8');
  // Read test cookie, if there
  $cookie_received = (isset($_COOKIE['third_party_c_t']) && $_COOKIE['third_party_c_t'] == 'hey there!');
  // And clear it so the user can test it again 
  setcookie('third_party_c_t', '', time() - 3600*24);
?>
window._3rd_party_test_step2_loaded(<?php echo ($cookie_received ? 'true' : 'false'); ?>);

最后一行使用三元运算符输出 Javascript 文字true or false取决于测试 cookie 是否存在。

在这里测试一下.

您可以在以下位置享受测试乐趣https://alanhogan.github.io/web-experiments/3rd/third-party-cookies.html.

(最后一点——不要使用别人的服务器未经许可测试第三方 cookie。它可能会自发崩溃或注入恶意软件。而且这很粗鲁。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查是否启用第三方cookie 的相关文章

  • 在原子操作中测试和递减?

    我刚刚发现了一个恼人的错误 它基本上是一个竞争条件 为了便于论证 我们假设一个非常简单的文档结构 例如 id XXX amount 100 集合中存在数百个这样的文档 并且由多个编写器访问 这些编写器有效地尝试将数量降低任何值 但绝不会低于
  • 使用 jQuery 的 .trigger('dragstart') 实现 HTML5 的拖放功能时如何 .setData/.getData

    当使用 jQuery 的 trigger dragstart 在具有 ondragstart drag event 属性的元素上触发函数时 如何使用 setData getData 实现 HTML5 在触摸设备上的拖放 流程示例 用户通过
  • 使用过渡添加子项时 div 的平滑增长

    尽管使用了以下代码 但其行为并不符合我的预期transition所以可能有些事情我不明白 理想情况下 单击该按钮会将一个子项添加到id2div 并制作id1分区增长smoothly因此 function id1 button click g
  • 如何在本机反应中发出触摸事件

    我正在尝试启用 panResponder 以拖放模式在屏幕上移动组件 然而 这种拖放必须通过longPress在这样的元素上 longPress捕获事件 所以当panResponder已启用onStartShouldSetPanRespon
  • 发送电子邮件的 Google Apps 脚本语法错误。无法识别我的问题

    我正在尝试让 Google 工作表从工作簿中另一张工作表的长列表中发送个性化电子邮件 我使用了教程 因为我是所有编码语言的认证新手 但 AppScript 告诉我第 4 行有语法错误 我一生都无法弄清楚我做错了什么 但我确信当由具有这些合法
  • 如何使单词中的每个字母在悬停时发生变化

    假设我的网站上某个段落中有一个单词 IamGreat 我希望它在悬停时更改为 Good4you 但是 我不想更改整个单词 而是希望每个字母单独更改 因此 如果我将鼠标悬停在字母 I 上 它将变成字母 G 字母 r 将变成数字 4 等 这两个
  • Protractor - 等待多个元素

    我正在尝试等待页面上的多个元素 我不知道可能有多少个 但至少会有一个 我知道使用以下命令等待单个元素 效果很好 var EC protractor ExpectedConditions browser wait EC presenceOf
  • 等待动态加载脚本

    在我的页面正文中 我需要插入以下代码作为 AJAX 调用的结果 p Loading jQuery p p Using jQuery p 我不能使用 load 由于文档已经加载 因此该事件不会触发 这安全吗 如果没有 我如何确保在执行自定义生
  • 如何重定向到另一个页面并从表中传递 url 中的参数?

    如何重定向到另一个页面并从表中传递 url 中的参数 我在龙卷风模板中创建了类似的东西 table thead tr th Username th th Nation th th Rank th th th tr thead tbody f
  • 如何在 joomla 模块中通过 javascript 发送输入文件类型

    我想将带有 javascript 的文件发送到 php 文件 我的 php 文件中有这个表单
  • 将压缩的json数据存储在本地存储中

    我想将 JSON 数据存储在本地存储中 有时存储的数据可能超过 5MB 每个域的浏览器允许的最大阈值 无论如何 我可以压缩或压缩数据并将其存储在本地存储中吗 如果对大数据进行每个 JS 函数的压缩和解压 会增加多少延迟 我正在使用这个 js
  • Discord.js v12:如何等待 DM 通道中的消息?

    这是我尝试过的代码 message author dmChannel awaitMessages msg gt console log msg content 但它返回此错误消息 TypeError Cannot read property
  • 如何使用 JavaScript 禁用滚动条?

    当我仅在 Internet Explorer 7 中显示代表模式窗口的 div 时 我需要锁定浏览器滚动条 谷歌搜索我发现我可以使用document body style overflow hidden 但这不适用于 IE7 我也尝试过do
  • 解析 PHP 响应:未捕获的语法错误:意外的标记 <

    我正在使用 AJAX 来调用 PHP 脚本 我唯一需要从响应中解析的是脚本生成的随机 ID 问题是 PHP 脚本会引发许多错误 这些错误实际上很好 不会妨碍程序功能 唯一的问题是当我跑步时 parseJSON response I get
  • 为什么 "asdf".replace(/.*/g, "x") == "xx" ?

    我偶然发现了一个令人惊讶的 对我来说 事实 console log asdf replace g x Why two替代品 似乎任何没有换行符的非空字符串都会产生此模式的两个替换 使用替换函数 我可以看到第一个替换是整个字符串 第二个替换是
  • Node.js 连接 createServer 代码

    我正在阅读 Node js Connect 版本 2 15 0 Create a new connect server return Function api public function createServer function ap
  • 带有子节点的拖放区域

    我有一个带有多个子节点的拖放区域 主要元素有dropenter and dropleave事件 但是 如果您将文件拖动到主元素内部和子节点上方 则dropleave被触发 如何处理 以便dropleave仅当拖动的元素和鼠标位于主元素之外时
  • IE7 问题 - 当禁用文件下载自动提示时无法下载流式文件

    我的应用程序是基于 J2EE JSP Servlet 的 当我尝试从 JSP 打开新窗口 弹出窗口 并调用 Servlet 操作 例如 Streamer do 以在该弹出窗口内传输 PDF 文件时 我遇到了问题 问题 当 IE 7 gt 工
  • CSS交付优化:如何推迟CSS加载?

    我在尝试着优化 CSS 交付遵循针对开发人员的谷歌文档https developers google com speed docs insights OptimizeCSSDelivery example https developers
  • 从另一台服务器读取 Node.js 中的大文件

    我有两台相互通信的服务器 Server1 向 Server2 请求文件的部分内容 并将收到的数据存储到一个文件中 Server2 应该接收每个请求并创建一个流管道传输数据 假设服务器2中存储的文件 目录 如下 bigfile gz bigf

随机推荐

  • ViewPager 和 FragmentPagerAdapter 中 Fragment 的 Android 生命周期管理

    我一直在努力找出如何正确管理 Fragment 中的内容FragmentActivity with a ViewPager是 在详细介绍之前 我先对我面临的问题进行快速总结如下 我有一个FragmentActivity with a Vie
  • Android Studio 2.1 将字节码转换为 dex 时出错

    自从我将 android studio 从 2 0 更新到 2 1 后 我收到以下错误 错误 将字节码转换为 dex 时出错 原因 Dex 无法解析版本 52 字节代码 这是由于 使用 Java 8 或更高版本编译的库依赖项 如果 您正在库
  • 使用 Visual Studio 2015 编译 ToolsVersion 12

    我安装了一台新电脑并安装了VS2015 编译我当前正在处理的项目会产生一些无效代码 ILSpy 创建无法编译的源代码 使用 ToolsVersion 12 在 VS2013 中运行良好 日志文件告诉我 ToolsVersion 12 丢失
  • ExtJs4 - 与网格 ColumnModel 等效的是什么?

    ExtJs3相当于什么Ext grid ColumnModel在 ExtJs4 中 我想做的是隐藏一列 我在 ExtJs3 中做了如下操作 grid colModel setHidden 1 true 您可以使用 Ext grid colu
  • 查找非有限值的最快方法

    这是受到以下启发 python numpy 中的组合掩码 任务是创建一个包含所有非有限值的布尔数组 例如 gt gt gt arr np array 0 2 np inf np inf np nan gt gt gt np isfinite
  • 使用 EventTrigger 设置属性

    我希望能够使用 EventTrigger 设置属性 但这有很多问题 1 EventTriggers仅支持Actions 所以我必须使用storyBoard来设置我的属性 2 一旦我使用故事板 我有两个选择 停止 动画停止后 值将恢复到动画开
  • git log -L 不带差异

    我正在尝试使用git log L
  • 使用 Ruby 进行科学编程

    我正在使用 python 或 Octave 进行数学计算 因为手头有非常好的函数和库 但最近我对 Ruby 产生了兴趣 我想知道 Ruby 中是否有相当于 Python 中的 numpy scipy 的科学编程工具 具体来说 我正在寻找一些
  • 选择页面上的所有元素[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我正在寻找 javascript 中的一个函数 它可以单击我页面上的每个元素 链接 按钮
  • 将指针传递给结构数组时出错

    include
  • Bootstrap 多选不起作用

    我正在尝试使用多选 Bootstrap 我使用了以下代码 该代码也可以在他们的网站上找到 http davidstutz github io bootstrap multiselect 它显示了多选按钮 并且由于我已经选择了 奶酪和意大利辣
  • 没有 ControlContainer 的提供者和 ControlContainer 没有提供者

    我正在开发一个使用 Angular2 的应用程序 我正在尝试在我的应用程序中使用反应式表单 但遇到了一些错误 第一个错误是关于 NgControl 的 如下所示 没有 NgControl 的提供者 div 类 col md 8 错误 gt
  • C++ sizeof Vector 是 24?

    我只是在闲逛并学习向量和结构 有一次 我尝试以字节为单位输出向量的大小 这是代码 include
  • Android Gradle 插件 0.13 和 android-apt 1.3 出现错误

    我刚刚将我的 android gradle 插件从 0 12 更新到 0 13 而且我已经下载了gradle 2 1 然后 我尝试使用 beta 版的 android studio 0 8 9 但根据http tools android c
  • 抑制 Visual Studio 输出窗格的输出 (C++)

    当我在 Visual Studio 调试器中运行 Win32 项目时 我得到了大量关于加载了哪些 DLL 第一次机会异常等信息 有没有办法可以抑制这个输出 有一天 我可能想知道 C Windows SysWOW64 ntdll dll 何时
  • 如何获取 Android 手机所有者的名字和姓氏?

    有没有办法获取 Android 手机所有者的名字和姓氏 我在网上搜索过 但没有运气 我偶然发现thisStackoverlow 中的问题 但这正在获取所有联系人的名字和姓氏 我需要的只是获取所有者的名字和姓氏 我认为这仅适用于 ICS 及以
  • Python 社交身份验证 NotAllowedToDisconnect 位于 /disconnect/facebook/1/

    我正在尝试在 Django 应用程序中将注销与 Python Social Auth 一起使用 但我得到了 NotAllowedToDisconnect at disconnect facebook 1 这些是我的设置 SOCIAL AUT
  • 什么是基于文件的数据库?

    我参加了有关关系数据库的课程 我被要求研究基于文件的方法与关系数据库相比的优势 我发现理解关系数据库更容易 但理解基于文件的系统却很困难 基于文件的系统是否与在 Windows 分层系统上存储文件相同 即存储在文件夹和目录下的文本文件 纯
  • Reactjs删除拼写检查属性

    我正在使用 ReactJS 来渲染我的 DOM 我想添加spellcheck false 文本输入上的属性 所以我这样做 render return div div
  • 检查是否启用第三方cookie

    我有一个应用程序需要检查客户端浏览器是否启用了第三方 cookie 有谁知道如何在 JavaScript 中做到这一点 技术背景 第三方通过 HTTP 不是 JavaScript 设置和读取 cookie 因此 我们需要向外部域发送两个请求