@s4e/jsentinel
Version:
Script integrity and clipboard tamper detection for browsers.
2 lines (1 loc) • 1.4 kB
JavaScript
import{emit as e}from"./events-ffa6G8za.js";import{R as t}from"./index-hwEiSUPx.js";let o=!1;const i=new Set;function r(){if(!o){o=!0;try{const o=o=>{const r=o,n=e=>{if(!e)return"";try{const t=new URL(e,location.href);return"data:"===t.protocol||"blob:"===t.protocol?`${t.protocol}[redacted]`:(t.search="",t.hash="",t.toString())}catch(t){return String(e).split("?")[0].split("#")[0]}},c=(e,t=200)=>"string"==typeof e?e.length>t?e.slice(0,t)+"…":e:void 0,s=n(r.blockedURI||""),l=r.effectiveDirective||"",a=`${l}:${s}`;i.has(a)||(i.add(a),e({type:"alert",data:{key:`csp-${l}`,src:s||null,inline:!1,expected:void 0,got:s,severity:"error",reason:"csp-violation",description:t["csp-violation"],meta:{documentURI:n(r.documentURI||location.href),blockedURI:s,effectiveDirective:l,violatedDirective:r.violatedDirective,originalPolicy:c(r.originalPolicy,500),sourceFile:n(r.sourceFile||void 0),statusCode:"number"==typeof r.statusCode?r.statusCode:void 0,lineNumber:"number"==typeof r.lineNumber?r.lineNumber:void 0,columnNumber:"number"==typeof r.columnNumber?r.columnNumber:void 0,sample:c(r.sample,200),disposition:r.disposition,referrer:(e=>{if(e)try{return new URL(e,location.href).origin}catch(e){return}})(r.referrer),ts:Date.now()}}}))};document.addEventListener("securitypolicyviolation",o),addEventListener("securitypolicyviolation",o,!0)}catch(e){}}}export{r as installCspViolationListener};