Unsafe JavaScript Attempt to Access Frame Warning in Safari

在 Safari 浏览器中,开发人员有时会遇到一个警告信息:“Unsafe JavaScript attempt to access frame...”,这个警告信息通常是由于跨域访问导致的。

背景

Safari 浏览器实现了同源策略(Same-Origin Policy),即只允许来自同一域名、协议和端口的脚本进行交互。如果一个页面试图访问不同源的资源,浏览器就会报告一个错误并阻止脚本进一步运行。

但是,有些情况下我们需要在不同源之间进行数据交换或通信,这时候就需要使用跨域技术。

问题

在 Safari 浏览器中,当你使用跨域技术时,可能会遇到以下警告信息:

------ ---------- ------- -- ------ ----- ---- --- ------ ---- ----- ---- --- ------- -------- --------- --- ----- ---- ------

这个警告信息表明,来自一个域名的脚本试图访问另一个域名的内容。这种行为被认为是不安全的,并且会被浏览器拦截。

原因

这个警告信息通常出现在两个不同的域名之间进行跨域访问时。例如,你在一个来自 www.example.com 的网页中嵌入了一个来自 www.another.com 的 iframe,并且尝试从父页面中操作这个 iframe 中的 DOM 元素。

Safari 浏览器会检查两个页面之间的域名、协议和端口是否相同。如果不同,则会报告以上警告信息并拒绝访问。

解决方法

要解决这个问题,有以下几种方法:

1. 使用 postMessage

在父页面和 iframe 页面之间使用 postMessage 进行通信。这是一种安全的跨域通信方式,可以通过向目标窗口发送消息来实现数据交换或通信。以下是一个示例代码:

-- ------ ----
----- ------ - ---------------------------------
----------------------------------------- ---------------------------

-- ------ ----
---------------------------------- ----- -- -
  -- ------------- --- -------------------------- -
    ------------------------ -- -----
  -
---

2. 在服务器端进行代理

使用服务器端脚本对请求进行代理,使其看起来像是来自同一域名。例如,在 PHP 中可以使用 cURL 库进行代理。以下是一个示例代码:

---- - -----------------------------------
--- - ----------------
---------------- ----------------------- ------
---------------- --------------- -------
----- - ---------------
----------------

---- ------

3. 在 iframe 中使用 sandbox 属性

在 iframe 中使用 sandbox 属性来限制其脚本的操作权限。这个属性可以设置为 allow-scripts,表示只允许 iframe 中的脚本进行一些基本的操作,例如点击和滚动等。以下是一个示例代码:

------- ----------------------------- ---------------------------------

总结

在 Safari 浏览器中,跨域访问会导致警告信息“Unsafe JavaScript attempt to access frame...”。我们可以使用 postMessage、服务器端代理或者 iframe 的 sandbox 属性来解决这个问题。选择哪种方法要根据具体情况而定,但是需要注意安全性和可

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/29775