SecurityError:阻止具有来源的框架访问跨来源框架

2024-01-10

我正在加载一个<iframe>在我的 HTML 页面中,并尝试使用 JavaScript 访问其中的元素,但是当我尝试执行代码时,出现以下错误:

SecurityError:阻止源为“http://www.example.com”的框架访问跨源框架。

如何访问框架中的元素?

我正在使用这段代码进行测试,但没有成功:

$(document).ready(function() {
    var iframeWindow = document.getElementById("my-iframe-id").contentWindow;

    iframeWindow.addEventListener("load", function() {
        var doc = iframe.contentDocument || iframe.contentWindow.document;
        var target = doc.getElementById("my-target-id");

        target.innerHTML = "Found it!";
    });
});

同源策略

You can't访问一个<iframe>使用 JavaScript 的不同来源,如果你能做到这一点,那将是一个巨大的安全漏洞。为了同源策略 https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy 浏览器阻止脚本尝试访问具有不同来源的框架.

如果地址的以下部分至少之一未维护,则认为来源不同:


protocol://hostname:port/...  

如果您想访问框架,协议、主机名和端口必须与您的域相同。

NOTE: though mostly unused nowadays, Internet Explorer is known to not strictly follow this rule, see here https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy#Exceptions_in_Internet_Explorer for details.

Examples

以下是尝试访问以下 URL 时会发生的情况http://www.example.com/home/index.html

URL                                             RESULT
http://www.example.com/home/other.html       -> Success
http://www.example.com/dir/inner/another.php -> Success
http://www.example.com:80                    -> Success (default port for HTTP)
http://www.example.com:2251                  -> Failure: different port
http://data.example.com/dir/other.html       -> Failure: different hostname
https://www.example.com/home/index.html:80   -> Failure: different protocol
ftp://www.example.com:21                     -> Failure: different protocol & port
https://google.com/search?q=james+bond       -> Failure: different protocol, port & hostname

解决方法

尽管同源策略会阻止脚本访问不同来源的网站内容,如果您拥有这两个页面,则可以使用以下方法解决此问题window.postMessage https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage及其亲戚message event在两个页面之间发送消息,如下所示:

  • 在您的主页中:

    const frame = document.getElementById('your-frame-id');
    frame.contentWindow.postMessage(/*any variable or object here*/, 'https://your-second-site.example');
    

    第二个参数postMessage() can be '*'表明对目的地的出发地没有偏好。应尽可能提供目标来源,以避免泄露您发送到任何其他站点的数据。

  • In your <iframe>(包含在主页中):

    window.addEventListener('message', event => {
        // IMPORTANT: check the origin of the data!
        if (event.origin === 'https://your-first-site.example') {
            // The data was sent from your site.
            // Data sent with postMessage is stored in event.data:
            console.log(event.data);
        } else {
            // The data was NOT sent from your site!
            // Be careful! Do not use it. This else branch is
            // here just for clarity, you usually shouldn't need it.
            return;
        }
    });
    

该方法可以应用在两个方向,也在主页中创建一个侦听器,并接收来自框架的响应。相同的逻辑也可以在弹出窗口和基本上由主页生成的任何新窗口中实现(例如使用window.open() https://developer.mozilla.org/en-US/docs/Web/API/Window/open)同样如此,没有任何区别。

禁用同源策略your browser

关于这个主题已经有一些很好的答案(我刚刚在谷歌上找到了它们),因此,对于可能的浏览器,我将链接相关答案。但是,请记住禁用同源策略只会影响your browser。此外,运行具有同源安全设置的浏览器禁用授权any网站访问跨域资源,所以这是非常不安全的,如果您不确切知道自己在做什么(例如开发目的),则永远不要这样做.

  • 谷歌浏览器 https://stackoverflow.com/q/3102819/3889449
  • 火狐浏览器 https://stackoverflow.com/q/17088609/3889449
  • Safari https://stackoverflow.com/q/4556429/3889449
  • Opera https://stackoverflow.com/q/7543678/3889449:与 Chrome 相同
  • Microsoft Edge:与 Chrome 相同
  • Brave:与 Chrome 相同
  • Microsoft Edge(旧的非 Chromium 版本):不可能 https://superuser.com/q/1020612/591004
  • 微软浏览器 https://stackoverflow.com/q/20947359/3889449
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SecurityError:阻止具有来源的框架访问跨来源框架 的相关文章

  • AngularJS:选择非 2 路绑定到模型

    我正在使用选择来显示客户名称 用户应该能够选择现有客户端 然后更新范围属性 控制器 初始化 首选 if scope clients length gt 0 scope existingClient scope clients 0 View
  • 如何翻转 Twitter Bootstrap 的工具提示

    我正在使用 Twitter 的 Bootstrap 来实现工具提示 目前 工具提示显示在链接上方 我希望工具提示出现在链接下方 我该怎么做呢 我正在触发工具提示 它明确指出 底部 但它不想为我工作 tooltip tooltip place
  • jQuery UI 可排序和对话

    是否可以在两个列表之间拖动 jQuery UI 可排序列表项 其中一个在 jQuery UI 对话框中 另一个不在 jQuery UI 对话框中 我正在尝试创建一个对话框 用户可以将表单字段从对话框中拖到页面上的表单中 但我无法将项目拖出对
  • 如何在 Angular 2 应用程序中使 DateAdapter 单例?

    我正在开发一个带有延迟加载模块的 Angular 7 应用程序 我也使用有角度的材料组件 我想在日期选择器组件中本地化并支持多个区域设置 当应用程序语言发生变化时 我想在整个应用程序中全局更改它 可以通过 DateAdapter setLo
  • 在 JQuery ui 自动完成中显示图像

    我有一个带有 JQuery ui 自动完成功能的脚本 可以完美运行 有一个显示用户名字和姓氏的搜索过程 但在我的数据库中 还有用户的图片 我想将其显示在带有名字和姓氏的建议中 数据库中pic包含图片url 剧本 function searc
  • 动态更改 vuejs 2 中的选择输入选项

    如何动态更改选择下拉 v model 中的选项 我有 2 个选择输入 其中一个应该根据其他输入进行更改 例如 如果我选择 水果 则选择显示水果 如果我选择 蔬菜 则选择显示蔬菜 我不使用Vuejs 但查看文档后 var TypesArr F
  • Gmail 和 Google Chrome 12+ 中的“从剪贴板粘贴图像”功能如何工作?

    我注意到一个来自 Google 的博文 http gmailblog blogspot com 2011 06 pasting images into messages just got html其中提到 如果您使用的是最新版本的 Chro
  • 我们如何使用 thymeleaf 绑定对象列表的列表

    我有一个表单 用户可以在其中添加任意数量的内容表对象这也可以包含他想要的列对象 就像在 SQL 中构建表一样 我尝试了下面的代码 但没有任何效果 并且当我尝试绑定两个列表时 表单不再出现 控制器 ModelAttribute page pu
  • jquery ajax加载后丢失CSS

    大家知道如何解决 load Ajax 请求后的 css 问题吗 例如 如果我想从网页加载 DIV 在我的 Ajax 请求之后 container load path to div div id 我丢失了与该 div 关联的所有 css 和脚
  • 如何使用 Jquery .animate() 函数创建连续滚动内容? [复制]

    这个问题在这里已经有答案了 可能的重复 在jquery中实现圆形滚动条 https stackoverflow com questions 812049 implementing circular scroller in jquery 我想
  • 如何在具有现有记录的 json 数据表顶部添加新行

    我试图在数据表顶部添加一行 显示 金额 列的总和 我正在使用 json 数据表 jquery 插件 列表来显示数据表 如何将此行与现有行一起添加到数据表顶部 我认为这段代码会对你有所帮助 var json uid user123 first
  • SlickGrid 回调onRowSelect?

    我想在用户选择表中的一行时添加回调 但我不知道该怎么做 这是我到目前为止所拥有的
  • Angular 停止 Enter 键提交

    I am trying to stop the Enter from submitting my button and rather make it point to another function I tried trapping th
  • 如何禁用 YouTube Iframe 上的全屏?

    我里面有一个 div 容器和 Iframe 我指定宽度 200 和高度 200 当我点击全屏时 视频变得模糊且质量非常差 所以 我想看看是否可以在 YouTube iframe 上禁用全屏 I used controls 0在我的网址末尾
  • 在firefox上用js改变表单方法

    我需要使用 javascript jQuery 或纯 更改表单的方法属性 我的表单有 method post 我尝试用以下方法更改它 submit button click function var url input id url val
  • JavaScript 正则表达式两个标签之间的多行文本

    我编写了一个正则表达式来从 HTML 中获取字符串 但似乎多行标志不起作用 这是我的模式 我想将文本输入h1 tag var pattern div class box content 5 h1 lt lt h1 gt mi m html
  • 角度 4 单击按钮功能未触发

    我正在尝试检查文本输入是否为空或不在角度 4 中 我没有为此使用表单 这只是一个输入字段 当我在下面的按钮中执行 addLocaton 函数时 需要进行检查 我的输入字段
  • iframe 主体删除空间

    我的 iframe 风格为style width 100 几乎覆盖了页面宽度 但它在左侧和右侧留下了一个小边距 所以我添加了body margin 0px 删除空间 它有效 但问题是删除边距影响其他事物 例如段落 p inside 有没有办
  • jQuery 如何实现延迟滑动?

    我正在使用以下 jQuery div 框向上滑动 5 秒后淡出 有没有办法实现这一点 因为该框需要很长时间才能出现 document ready function load limit slideUp 500 have tried fast
  • Javascript/jQuery 外部高度()

    Does idOfLememt outerHeight 对所有浏览器产生相同的结果 IE7 有什么不同吗 只要去http api jquery com outerHeight http api jquery com outerHeight

随机推荐

  • 使用 xslt 获取 X 位置处的节点值

    如何在不使用 foreach 的情况下使用 xslt X 位置的节点值
  • 获取Golang正则表达式中括号内的所有子字符串

    我想使用正则表达式获取 go 中所有括号内的所有子字符串 作为字符串 foo bar foo baz golang 的示例 我想要 bar 和 baz 在Python中我可以做re findall lt foo bar foo baz go
  • 卡尔曼滤波器总是在第一时间预测 0,0

    以下代码用于从下到上扫描图像 然而 卡尔曼滤波器的预测在第一次时总是显示0 0 这样 它就会从底部到 0 0 绘制一条线 如何使路径 卡尔曼滤波器 更接近实际路径 以下代码和图像已更新 import cv2 import matplotli
  • 布局API版本命名

    我不知道这是如何工作的 如果我创建了一个名为layout v11这适用于 v11 以上的所有 api 版本还是仅适用于 v11 第二个我可以将文件夹命名为layout v11 v14仅对 v11 和 v14 API 使用此布局 后缀指定资源
  • 从 xamarin 将文件上传到 Web api 服务器 - 请求处理时间太长

    我正在使用 HttpClient 将二进制文件发布到 Azure 托管的服务器 对于大小不太大的文件 该请求需要很长时间才能传递 有时 当客户端因超时而取消任务时 服务器会收到请求 我使用以下代码异步上传数据 public async Ta
  • Spirit X3可以与BOOST_FUSION_ADAPT_ADT一起使用吗?

    将我的代码从 QI 更改为 X3 并出现一些编译错误BOOST FUSION ADAPT ADT 我尝试了boost 1 64和1 67 它们都不起作用 我修改了精灵X3的例子rexpr min 添加 getter 和 setterstru
  • blogpost 的 rss feed 分页 url 是什么样的?

    我知道要访问 blogspot 博客的 rss feed 您需要访问 blog blogspot com feeds posts default 但是如何获取提要的第二页呢 我知道其他博客使用查询参数 paged 2 是否有类似的查询参数可
  • 如果资源已经存在,如何告诉 helm 不要创建/更改资源?

    我有一个秘密资源模板 安装后将为数据生成随机值 删除该图表 它没有删除秘密资源 因为它们保留下来 并稍后重新安装后 我遇到了问题 这导致它使用新生成的数据运行以前的秘密 这在我的情况下是不希望的 我试图找到我需要包含在模板中的 if 条件是
  • ASP.NET5 MVC6 的模型绑定问题

    我尝试将一些 JSON 数据以角度形式发布到我的 ASP NET5 MVC6 控制器操作 模型绑定器似乎不起作用 不知道我在这里缺少什么 我的 ASP 控制器 public class DefaultController Controlle
  • 有没有更好的方法为 numpy 数组标量分配新值?

    我正在对 numpy 数组中的标量值进行一些快速计算 正如它在文档 https docs scipy org doc numpy 1 13 0 user basics types html array scalars 使用数组标量的主要优点
  • 在ListBox中设置DrawMode删除水平滚动条

    我将列表框控件中的 DrawMode 设置为 OwnerDrawFixed 以便可以为某些项目着色 当项目太长而无法容纳列表框的水平空间时 不会出现水平滚动 怎样才能让滚动条出现呢 您应该在 OwnerDrawFixed 模式下设置列表框的
  • WPF dataGrid 多列的超级标题

    我想在WPF中为多列做标题DataGrid 我尝试使用标题模板 但它会显示一列的标题 下面的 XAML 我尝试过
  • MS Access 限制 X、Y

    是否可以模拟以下 MySQL 查询 SELECT FROM tbl ORDER BY date DESC LIMIT X 10 X为参数 在 MS Access 中 虽然访问 JET TOP关键字不直接提供OFFSET能力 我们可以巧妙地结
  • 为什么 NHibernate AutoFlush 检查如此昂贵?

    在实践中 我们发现默认的 NHibernate v2 0 2 1 FlushMode Auto 非常昂贵 查看 NHibernate 源代码表明 确定需要刷新的内容的算法依赖于循环遍历会话中所有实体的强力 并且这种情况发生在事务中运行的每个
  • 迁移时可以添加级联删除规则吗?

    在 FluentMigrator 迁移中 如果我定义关系 请说 Create Table RelatedTable WithColumn RelatedTableId AsGuid PrimaryKey WithColumn MainTab
  • 把 $$s 放在 `equation` 环境中:为什么 Latex 不抱怨?

    我很惊讶最近的问题中的 Latex 代码没有抛出任何错误 更令我惊讶的是进一步的调查 克劳利的解释 https stackoverflow com questions 2892982 formatting equations in late
  • 将整数转换为 std_logic

    假设你有一个循环 for i in 1 downto 0 loop for j in 1 downto 0 loop tS0 lt i 但我需要将整数 这是自然的 转换为 std logic tS0被声明为 std logic 我只做了一位
  • jQuery keydown 触发器不起作用

    我在文档加载结束时运行此脚本 function input keydown 该脚本位于 chrome 扩展中 该扩展在用户加载的每个页面上运行并且不起作用 即在 Twitter 网站上 但是 如果在 chrome javascript 控制
  • 如何使用javascript从父窗口获取子窗口url

    我正在启动一个带有窗口引用名称的子窗口 我想在每次更改时捕获子窗口的 URL var winRef var url http www google com if winRef null winRef closed winRef window
  • SecurityError:阻止具有来源的框架访问跨来源框架

    我正在加载一个在我的 HTML 页面中 并尝试使用 JavaScript 访问其中的元素 但是当我尝试执行代码时 出现以下错误 SecurityError 阻止源为 http www example com 的框架访问跨源框架 如何访问框架