无论如何都要从跨源脚本中捕获沙箱未捕获/不安全的错误消息

问题描述 投票:1回答:1

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

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

我的目标是报告发生在顶级页面的违规行为。例如,如果沙箱不允许弹出窗口。在控制台窗口中,会显示一条错误消息,提示“沙盒环境中不允许使用弹出窗口”。 onerror会检测到错误,但是当您检查消息时,它总是显示“脚本错误”。

我有不同的方法来捕获这些未捕获/不安全的错误消息吗?

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

javascript sandbox onerror
1个回答
0
投票

如果Javascript错误消息是“脚本错误。”,则无法通过Javascript提取实际错误消息。虽然用户可以检查其浏览器控制台以查看错误详细信息,但出于安全原因,跨域错误详细信息不会以任何方式暴露给您的Javascript。

为了缓解这种情况,如果可能的话,建议用户使用没有CORS限制的站点中的库。托管库的站点需要同时拥有两者

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

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

<script src="https://cdn.jsdelivr.net/npm/[email protected]/babel.min.js"></script>

因为jsdelivr具有这两个标头,所以抛出的错误将是可见的。 (原谅堆栈片段黑客,但它演示了问题:)

-->
</style>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/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>
<!--

如果库来自没有这两个标头的站点,则错误将是不透明的。例如,此代码段与上面的代码段相同,只是链接指向没有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>
<!--

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

© www.soinside.com 2019 - 2024. All rights reserved.