如何根治 Script Error.

news/2024/4/28 18:32:20/文章来源:https://blog.csdn.net/qq_32198115/article/details/126996050

作者:卢峰(清锐)

本文简要介绍了 Script Error 问题的来龙去脉,但也不局限于 Script Error,对于通用的系统性问题,应该找到系统性解决方案,进而治标治本。

Script Error 原因与当前解法

受浏览器同源策略限制,未知跨域脚本执行错误时,抛出的错误信息为 “Script error.”,导致开发者无法定位具体错误。为了获取详细错误信息及堆栈,一般解法是给 Script 标签配置 crossorigin 属性,同时对应脚本服务端需配置 Access-Control-Allow-Origin 响应头。

另外还有一些 hack 解法,对浏览器原生 API 做代理,将业务代码放在 Try Catch 作用域中执行,但写好代理方法是不容易的,粗制滥造的代理方法会制造很多隐藏 Bug,并且大量 Try Catch 在一些 JS Engine 中也存在额外性能损耗,为了解决 Script Error 采用此方案得不偿失。

还有什么问题

  1. crossorigin 不好加

异步加载脚本套娃,A 加载 B,B 加载 C,以至于不知道加载了哪些外部脚本

需要服务端配合设置响应头 Access-Control-Allow-Origin

  1. crossorigin 加不了

外部注入代码,如浏览器插件、定制 Webview 容器(xx 浏览器)

  1. 无效 Script Error 数据,难以评估对业务实际影响,并且耗费监控资源

溯源:为什么是 Script Error

从 2006 年一篇安全漏洞文章说起:I know if you’re logged-in, anywhere

在那个年代大量网站都是服务端渲染,服务端根据用户登录态返回不同页面内容,黑客通过 Script 加载目标站点,用户已登录、未登录返回的 Response 内容不同,报错信息也会有差异,这样就可以通过报错信息区分用户是否登录,进一步展开针对性的攻击。

<script src=” http://mail.google.com/mail/”></script> 

已登录:

**未登录: **

对于其他站点也是类似,错误信息中总会有差异,比如亚马逊登录和未登录,报错的 LineNo 不同。

基于此,WHATWG 对错误信息透出制定了规范:

Chrome 实现:

《I know if you’re logged-in, anywhere》地址:https://blog.jeremiahgrossman.com/2006/12/i-know-if-youre-logged-in-anywhere.html

Script Error 规范是否能调整

通过以上信息,我们可以理解 Script Error 的设计初衷以及其合理性,但我也有疑问,在今天浏览器同源策略比较完善的情况下,是否有必要屏蔽所有信息(error message、lineno、colno、url)?能否将发生 Script Error 的脚本 url 暴露出来,以便开发者收集到错误信息时快速定位错误来源,这样也方便评估影响面,比如明显是注入的脚本错误,直接忽略即可。

翻阅 WHATWG Github 历史 issue,发现已经有过相关讨论,很明确答案是 No,大概原因是当前的同源策略已经很全面(复杂),不想在挖坑。以至于对 unhanlderejection,连 Script Error 都不愿意报。

相关讨论地址:https://github.com/whatwg/html/issues/2440



unhanlderejection地址:https://github.com/whatwg/html/issues/5051

其他大厂如何处理 Script Error

我在几个大厂网站上做了测试,加载一个第三方脚本,第三方脚本一定会报错,看看对应站点如何处理。

var s = document.createElement('script'); 
s.src = 'https://g.alicdn.com/dinamic/h5-tb-cart/5.0.41/index.min.js'; 
document.body.appendChild(s);

  1. Google:常规处理,直接上报 Script Error

  2. Twitter: 通过 CSP 策略拦截了未知脚本加载,包括 Github、FaceBook 都采用类似方案

  3. QQ 视频:除了上报 Script Error,并监控上报异步加载的脚本

面向未来我们应该如何处理 Script Error

面向未来看问题,我们不能与标准背道而驰,同源策略是当前解决 Web 安全问题的重要手段,在未来只会更完善,我们应该积极了解与应用。当前国内互联网对同源策略的了解与应用大多止步于 Access-Control-Allow-Origin: *,这是远远不够的。

因此,面向未来 Script Error 问题 Twitter 的处理方式相对合理,只允许站点加载白名单脚本,对白名单脚本逐个做 CrossOring 等配置,同时也杜绝了外部脚本注入。对于淘宝来说,受限于业务体量以及历史包袱,做这种改造难度可想而知,但我们应该朝这个方向努力,而不是让开发者面对 Script Error 手足无措,靠猜测或是加错误过滤解决问题。

回到当下,短期的解决方案要增强跨域脚本的感知能力,可以配置 CSP Report Only 上报跨域脚本,也可以通过原始手段统计,进而对相关脚本做跨域配置,对于明显的跨域脚本如埋点、唤端、以及安全系列脚本,缺少 crossorigin 的尽快修复。

CSP Report Only地址:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only

document.querySelectorAll('script[src]:not([crossorigin])')

本文简要介绍了 Script Error 问题的来龙去脉,但也不局限于 Script Error,对于通用的系统性问题,应该找到系统性解决方案,进而治标治本。

参考文档

  1. what is script error(地址:https://blog.sentry.io/2016/05/17/what-is-script-error)

  2. Cryptic “Script Error.” reported in Javascript in Chrome and Firefox(地址:https://stackoverflow.com/questions/5913978/cryptic-script-error-reported-in-javascript-in-chrome-and-firefox)

  3. 解决 “Script Error” 的另类思路(地址:https://juejin.cn/post/6844903727820718094#heading-6)

  4. iOS Privacy: Instagram and Facebook can track anything you do on any website in their in-app browser(地址:https://krausefx.com/blog/ios-privacy-instagram-and-facebook-can-track-anything-you-do-on-any-website-in-their-in-app-browser)

  5. I know if you’re logged-in, anywhere(地址:https://blog.jeremiahgrossman.com/2006/12/i-know-if-youre-logged-in-anywhere.html)

  6. HTML Spec: Runtime script errors(地址:https://html.spec.whatwg.org/multipage/webappapis.html#runtime-script-errors)

  7. “Script error.” message in window.onerror makes bad DevExp trade off(地址:https://github.com/whatwg/html/issues/2440)

  8. unhandledrejection should fire even for muted scripts(地址:https://github.com/whatwg/html/issues/5051)

  9. Content-Security-Policy-Report-Only(地址:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_12203.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第一个spring项目

第一个spring项目 1、maven依赖导入 <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.22</version> </dependency> <dependency><groupId>junit</gro…

计算机毕设源码网站基于SpringBoot的阳光线上交友系统

&#x1f345;文末获取联系&#x1f345; 目录 一、项目介绍 二、开题报告 三、截图 四、源码获取 一、项目介绍 基于SpringBoot的阳光线上交友系统-计算机毕设java毕业设计项目源码-可定制-IT实战课堂_哔哩哔哩_bilibili项目资料网址: http://www.itszkt.com毕业设计…

Python 内存管理的工作原理你了解吗?

Python 为开发者提供了许多便利&#xff0c;其中最大的便利之一是其几乎无忧的内存管理。开发者无需手动为 Python 中的对象和数据结构分配、跟踪和释放内存。运行时会为你完成所有这些工作&#xff0c;因此你可以专注于解决实际问题&#xff0c;而不是争论机器级细节。 尽管如…

唯杰地图之前端CAD图GIS数据访问权限配置

前言 数字经济时代,数据要素的价值日益凸显,与之相应的,数据安全问题也越来越受到重视。唯杰地图 VJMAP为CAD图或自定义地图格式WebGIS可视化显示开发提供的一站式解决方案,支持的格式如常用的AutoCAD的DWG格式文件、GeoJSON等常用GIS文件格式,它使用WebGL矢量图块和栅格瓦…

一文清晰讲明白DDD(领域驱动设计)的知识点

什么是DDD DDD&#xff08;领域驱动设计&#xff09;是一种处理高度复杂领域的设计思想&#xff0c;是一种架构设计方法论&#xff0c;是一种设计模式。以高内聚低耦合为目的&#xff0c;把一个复杂的软件应用系统中各个部分进行一个很好的拆解和封装&#xff0c;对软件系统进…

运算放大器积分电路上并联的电阻什么作用

学过模电的同学对运放积分电路应该都不会陌生&#xff0c;基本电路如下图中所示 积分电路主要是用来进行波形变换&#xff0c;放大电路失调的消除&#xff0c;以及反馈控制中的积分补偿。 常用积分电路将方波变幻成三角波&#xff0c;或者正弦波变成余弦波&#xff0c;今天我们…

拍照识别花草软件有哪些?识别植物花草的软件哪个准?

不知道有没有小伙伴和我一样&#xff0c;好奇心比较旺盛&#xff0c;遇到问题都喜欢打破砂锅问到底。就连平时在路上遇到一些好看的花花草草时&#xff0c;我都想知道它是什么。但是花草这些就比较特殊&#xff0c;想了解它的身份&#xff0c;光靠描述可行不通。借助识别工具来…

UEC++ 代理/委托

代理&#xff1a; 代理可以帮助我们解决一对一或是一对多的任务分配工作。主要可以帮助我们解决通知问题。我们可以通过代理完成调用某一个对象的一个函数&#xff0c;而不直接持有该对象的任何指针。代理就是为你跑腿送信的&#xff0c;你可以不用关心给送信的目标人具体是谁…

异步线程使用Request存在问题

概述 如果我们将request传递到异步线程中使用&#xff0c;可能获取不到参数&#xff0c;并且会导致后续的请求&#xff0c;使用到这个线程也会出问题。 原因就是request对象会被重复使用。 源码分析 1、获取参数 先看一个非常重要的方法&#xff0c;getParameter 方法调用第…

计算机毕业设计之java+javaweb的美容院管理系统

计算机毕业设计之javajavaweb的美容院管理系统 项目介绍 系统权限按管理员、用户、医生和美容师这四类涉及用户。 (a) 管理员&#xff1a;进入系统可以实现主页、个人中心、用户管理、医生管理、美容师管理、项目部门管理、项目类型管理、产品分类管理、产品信息管理、医美项目…

JavaEE:进程调度的基本过程

目录 进程是什么? 操作系统对进程的调度 2.1 PCB中的信息 2.2 进程的调度是如何进行的呢? 并行: 并发: 总结: 进程是什么? 如果想了解进程调度的基本过程,我们首先要了解的是进程是什么? 咱们可以在任务管理器中看到 这一切跑起来的程序就是进程! 操作系统对进程的调…

22.this指针

1.this指针工作原理 我们知道,c++的数据和操作也是分开存储,并且每一个非内联成员函数(non-inline member function)只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码那么问题是:这一块代码是如何区分那个对象调用自己的呢?c++通过提供特殊的对象指针,this…

Python面向对象笔记

一、面向对象 (一)基本概念 (1)面向对象编程 —— Object Oriented Programming 简写 OOP (2)面向对象三大特性封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中定义类的准则封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一…

王道-考研-数据结构-线索二叉树

线索二叉树的构造 常用的是中序线索二叉树。 寻找前驱结点:若左指针为线索,则其指向结点为前驱结点。 若左指针为左孩子,则其左子树的最右侧结点为前驱结点。寻找后继结点:若右指针为线索,则其指向结点为后继结点。 若右指针为右孩子,则其右子树的最左侧结点为后继结点。…

Vue支持多文件上传 前端+后端 (详细介绍)

前端vue后端java支持多文件上传效果图Vue部分后台部分效果图 可以上传多个文件 Vue部分 <template><div><el-form-item label"案例名称" prop"caseName"><el-input v-model"formObj.caseName" placeholder"请输入案…

计算机毕业设计之java+javaweb的网上电子书店-图书商城网站

计算机毕业设计之javajavaweb的网上电子书店-图书商城网站 项目介绍 系统权限按管理员和用户这两类涉及用户划分。 (a) 管理员&#xff1a;管理员使用本系统涉到的功能主要有主页、个人中心、用户管理、一级分类管理、二级分类管理、电子书管理、下单购买管理、我的书籍管理、留…

MUR1100-ASEMI快恢复二极管MUR1100

编辑-Z MUR1100在DO-41封装里采用的1个芯片&#xff0c;其尺寸都是50MIL&#xff0c;是一款快恢复二极管。MUR1100的浪涌电流Ifsm为35A&#xff0c;漏电流(Ir)为10uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。MUR1100采用GPP硅芯片材质&#xff0c;里面有1颗芯片组成。…

如何用Vue + Mint UI实现上拉加载更多?

引言: 上拉加载更多在移动端不论是在 app 里面还是在页面中都是必不可少的&#xff0c;以下是 mint-ui 中上拉加载更多的总结。 一、在项目中使用 mint-ui 需要先安装 查看官网 (1)安装:npm i mint-ui --save (2)在 vue 中 main.js 引入 import MintUi from mint-ui import mi…

图扑数字孪生军事营区,实现主动防御

前言 20 世纪 50 年代初中国人民解放军开始自建营区。传统营区管理系统以独立的“点状”系统为主&#xff0c;缺乏集控平台&#xff0c;全局管理复杂度高。70 年代末提出建设智能化营区&#xff0c;并向“数字化、智能化、网络化、互动化、融合化”的方向靠拢。通过建设集光电…

【车辆配送】基于模拟退火 (SA)求解车辆配送 (VPR) (Matlab代码实现)

目录 1 车辆配送问题 2 模拟退火法 3 Matlab代码实现 4 实现结果 5 参考文献 6 写在最后 1 车辆配送问题 式(9)~( 12)中, 为配送车辆到达需求点i的时间;为需求点i到需求点j的运输成本;、分别为配送车辆提前到达需求点i的或者滞后到达需求点i的单位时间内的等待成本以及惩…