rules: - id: react-dangerously-set-inner-html languages: [typescript, javascript] severity: ERROR message: dangerouslySetInnerHTML ist ein XSS-Einfallstor. Text rendern oder mit DOMPurify säubern. pattern-either: - pattern: <$EL dangerouslySetInnerHTML={...} /> - pattern: <$EL dangerouslySetInnerHTML={...}>... - pattern: "{dangerouslySetInnerHTML: ...}" - id: dom-inner-html languages: [typescript, javascript] severity: ERROR message: innerHTML/outerHTML/insertAdjacentHTML mit dynamischem Inhalt (XSS). textContent verwenden. patterns: - pattern-either: - pattern: $EL.innerHTML = $V - pattern: $EL.outerHTML = $V - pattern: $EL.insertAdjacentHTML($POS, $V) - pattern: document.write($V) - pattern-not: $EL.innerHTML = "..." - pattern-not: $EL.innerHTML = `` - id: token-in-web-storage languages: [typescript, javascript] severity: WARNING message: Token/Secret im Web Storage ist per XSS auslesbar. HttpOnly-Cookie verwenden. patterns: - pattern-either: - pattern: localStorage.setItem($K, ...) - pattern: sessionStorage.setItem($K, ...) - pattern: window.localStorage.setItem($K, ...) - metavariable-regex: metavariable: $K regex: (?i).*(token|jwt|secret|auth|session|password|api.?key).* - id: express-cors-wildcard languages: [typescript, javascript] severity: ERROR message: CORS erlaubt jede Origin (bei credentials besonders gefährlich). Origins explizit auflisten. pattern-either: - pattern: cors() - pattern: 'cors({..., origin: "*", ...})' - pattern: 'cors({..., origin: true, ...})' - pattern: $RES.setHeader("Access-Control-Allow-Origin", "*") - pattern: $RES.header("Access-Control-Allow-Origin", "*") - id: sql-template-string languages: [typescript, javascript] severity: ERROR message: SQL per Template-String oder Verkettung. Platzhalter/Query-Builder verwenden. patterns: - pattern-either: - pattern: $DB.$M(`...${$X}...`, ...) - pattern: $DB.$M("..." + $X, ...) - pattern: sql.raw(`...${$X}...`) - pattern: sql.raw("..." + $X) - metavariable-regex: metavariable: $M regex: ^(query|exec|execute|prepare|run|all|get|raw|\$queryRawUnsafe|\$executeRawUnsafe)$ - id: tls-verification-disabled-node languages: [typescript, javascript] severity: ERROR message: TLS-Zertifikatsprüfung abgeschaltet. pattern-either: - pattern: "{..., rejectUnauthorized: false, ...}" - pattern: process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" - id: jwt-decode-without-verify languages: [typescript, javascript] severity: ERROR message: jwt.decode prüft keine Signatur. jwt.verify verwenden. pattern-either: - pattern: jwt.decode(...) - pattern: 'jwt.verify($T, $K, {..., algorithms: [..., "none", ...], ...})'