有没有办法捕获来自跨源脚本的沙箱 Uncaught/Unsafe 错误消息

Is there anyway to catch sandbox Uncaught/Unsafe error messages from cross-origin scripts

添加错误事件侦听器时,通常您会收到一个包含有关错误消息的详细信息(消息、行、列等)的 ErrorEvent 对象;但是,当跨源脚本抛出错误时,您得到的只是 "Script error." 消息。据我了解,这样做是出于安全原因。

由于这个限制,我 运行 遇到了一些问题。我在一个 IFrame 元素中有 运行 个跨源脚本(不是我的脚本,它们可能来自任何地方,我不控制它们,这里是完全随机的),我在其中添加了一个错误事件侦听器和 "sandbox"属性。

我的目标是报告发生在顶级页面上的沙盒违规行为。因此,例如,如果沙箱不允许弹出窗口。在控制台 window 中显示一条错误消息,内容类似于 "Pops are not allowed in a sandboxed environment"。 onerror 会发现错误,但是当您检查消息时,它总是显示 "Script error".

有没有其他方法可以捕捉这些 uncaught/unsafe 错误消息?

我的目标是解析消息以查看哪些沙箱违规被抛出以进行记录。此方法不起作用,因为 IFrame 中任何未捕获的错误消息都将被转换为相同的消息,这可能会导致误报。例如,有人做了 throw new Error('test'),现在我无法判断这是沙盒错误还是脚本错误。

如果 Javascript 错误消息是 "Script error.",则无法通过 Javascript 提取 actual 错误消息。虽然用户可以检查他们的浏览器控制台以查看错误详细信息,但出于安全原因,cross-origin 错误详细信息不会以任何方式暴露给您的 Javascript。

为了缓解这种情况,如果可能的话,建议用户使用来自 没有 CORS 限制的站点的库。托管图书馆的网站需要 both

access-control-allow-origin: *
access-control-expose-headers: *

为了捕获该站点托管的脚本中抛出的错误。例如:

<script src="https://cdn.jsdelivr.net/npm/babel-standalone@6.10.3/babel.min.js"></script>

因为 jsdelivr 有这两个 headers,抛出的错误将是可见的。 (请原谅堆栈片段黑客攻击,但它证明了问题:)

-->
</style>
<script src="https://cdn.jsdelivr.net/npm/babel-standalone@6.10.3/babel.min.js"></script>
</script>
</head>
<body>
<script src="/scripts/snippet-javascript-console.min.js?v=1"></script>
<script type="text/babel">Invalid syntax
</style>
<!--

如果库来自没有这两个 headers 的站点,则错误将是不透明的。例如,此代码段与上面的相同,只是 link 指向没有 access-control-expose-headers: *:

的站点

-->
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.10.3/babel.min.js"></script>
</script>
</head>
<body>
<script src="/scripts/snippet-javascript-console.min.js?v=1"></script>
<script type="text/babel">Invalid syntax
</style>
<!--

如果您完全无法控制用户使用哪个库 link,您将无法访问不透明的错误,除非您可以让他们安装自定义浏览器扩展(具有升级的权限)或类似的东西。