window.onerror捕获CSP错误不生效,能否通过onerror获取CSP错误信息
结论
window.onerror 无法捕获CSP(内容安全策略)违规类错误。
原因说明
- CSP违规属于浏览器安全策略触发的事件,不属于普通JavaScript运行时错误,
window.onerror的设计覆盖范围仅包含JS脚本执行产生的运行时错误,部分浏览器下甚至不会捕获静态资源加载失败类的错误,安全策略类事件不在其监听范围内。 - 按照W3C规范定义,CSP违规有独立的事件类型
SecurityPolicyViolationEvent,只能通过window.onsecuritypolicyviolation绑定回调、或者给全局添加securitypolicyviolation事件监听器来捕获,这类事件不会触发window.onerror的执行,你之前通过onsecuritypolicyviolation能拿到信息是符合规范预期的表现。
兼容处理方案
如果需要统一管理全量错误上报,可以把CSP事件监听的逻辑和window.onerror的处理逻辑做复用,两类事件的信息格式化后走同一套上报流程即可,示例如下:
// 通用错误上报逻辑,两类错误都可以调用 function reportError(info) { // 这里写你的上报或提示逻辑 alert(info) } // 原有普通JS错误监听 window.onerror = function(msg, url, lineNo, columnNo, error) { var string = msg.toLowerCase(); var substring = "script error"; if (string.indexOf(substring) > -1) { reportError('Script Error: See Browser Console for Detail'); } else { var message = [ 'Message: ' + msg, 'URL: ' + url, 'Line: ' + lineNo, 'Column: ' + columnNo, 'Error object: ' + JSON.stringify(error) ].join(' - '); reportError(message); } return false; }; // 新增CSP违规错误监听 window.addEventListener('securitypolicyviolation', (e) => { const cspErrorMsg = [ 'Message: CSP 策略违规', '违规指令: ' + e.effectiveDirective, '拦截资源: ' + e.blockedURI, 'URL: ' + e.documentURI, 'Line: ' + e.lineNumber, 'Column: ' + e.columnNumber ].join(' - ') reportError(cspErrorMsg) })
内容的提问来源于stack exchange,提问作者hopper01
相关产品推荐
相关产品推荐

