Есть ли в любом случае, чтобы поймать песочницу Uncaught / Unsafe сообщения об ошибках из сценариев разных источников - PullRequest
1 голос
/ 22 апреля 2019

При добавлении прослушивателя события ошибки обычно вы получаете объект ErrorEvent, полный подробностей (сообщение, строка, столбец и т. Д.) О сообщении об ошибке;однако, когда выдается ошибка из сценария с несколькими источниками, все, что вы получаете, это «Ошибка сценария».сообщение.Насколько я понимаю, это сделано из соображений безопасности.

У меня возникли некоторые проблемы из-за этого ограничения.У меня запущены сценарии кросс-происхождения (не мои сценарии, они могут прийти откуда угодно, я не контролирую их, общая случайность здесь) в элементе IFrame, где я добавил прослушиватель события ошибки и атрибут «песочница».

Моей целью было сообщить о нарушениях в песочнице, которые произошли на странице верхнего уровня.Например, если песочница не позволяет всплывающие окна.В окне консоли отображается сообщение об ошибке, в котором говорится что-то вроде «Всплывающие окна не разрешены в изолированной среде».Onerror обнаруживает ошибку, но когда вы проверяете сообщение, оно всегда говорит «Ошибка сценария».

Есть ли другой способ для меня перехватить эти необнаруженные / небезопасные сообщения об ошибках?

Моя цель состоит в том, чтобы разобрать сообщения, чтобы увидеть, какие нарушения песочницы выбрасываются для регистрации.Этот метод не будет работать, потому что любое неперехваченное сообщение об ошибке в IFrame будет переведено в то же сообщение, что может привести к ложным срабатываниям.Например, кто-то делает throw new Error('test'), и теперь я не могу сказать, была ли это ошибка песочницы или ошибка скрипта.

1 Ответ

0 голосов
/ 22 апреля 2019

Если в сообщении об ошибке Javascript указано «Ошибка сценария», невозможно извлечь сообщение об ошибке фактическое через Javascript.Хотя пользователь может просматривать консоль своего браузера, чтобы увидеть подробности об ошибках, подробности об перекрестных источниках не будут каким-либо образом предоставлены вашему Javascript по соображениям безопасности.

Чтобы смягчить это, если это вообще возможно,Предполагается, что пользователи используют библиотеки с сайтов, которые не имеют ограничения CORS.Сайт, на котором размещена библиотека, должен иметь и

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 имеет оба этих заголовка, сгенерированные ошибки будут доступны для просмотра.(Простите хаки фрагментов стека, но это демонстрирует проблему:)

-->
</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>
<!--

Если библиотека поступает с сайта без обоих этих заголовков, ошибка будет непрозрачной.Например, этот фрагмент идентичен приведенному выше, за исключением того, что ссылка на сайт без 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>
<!--

Если у вас нет никакого контроля над тем, какие ссылки библиотеки используются пользователями, вы ничего не можете сделать, чтобы получить доступ к непрозрачным ошибкам, если только вы не можете получитьчтобы установить собственное расширение для браузера (которое имеет повышенные привилегии) ​​или что-то в этом роде.

...