← Legacy view v2 (rp.*)

millionco/react-doctor

https://github.com/millionco/react-doctor.git · lang: typescript · LOC: · source: both

Quality
76.2
Grade B+
Security
92.8
Findings
85
4 critical · 17 high
Status
completed
May 24, 2026 01:20
info: 38 high: 17 low: 17 medium: 9 critical: 4
Top rules by occurrence
RuleSeverityCount
AIC003 Duplicated implementation block across source files low 15
MINED115 GitHub Action pinned to mutable ref (not 40-char SHA) high 6
SEC040 innerHTML XSS — template literal with server-supplied data high 4
MINED044 Js Console Log Prod info 4
MINED087 Js Always True If info 4
SEC045 eval()/exec() on stored or user-supplied data medium 4
MINED058 React Dangerously Set Html info 4
SEC085 JS: child_process.exec with non-literal high 4
MINED045 Ts Non Null Assertion info 4
MINED043 Http Not Https info 4
First 85 findings (severity-sorted)
critical MINED024 Js Eval Usage CWE-95
packages/oxlint-plugin-react-doctor/src/plugin/rules/security/no-eval.ts:17 · conf 1.00
[MINED024] Js Eval Usage: eval() executes arbitrary code. Code injection risk.
critical MINED035 Js New Function CWE-95
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/__fixtures__/jsx-no-new-function-as-prop.fixtures.ts:35 · conf 1.00
[MINED035] Js New Function: new Function(...) compiles strings to functions.
critical MINED035 Js New Function CWE-95
packages/oxlint-plugin-react-doctor/src/plugin/rules/security/no-eval.ts:38 · conf 1.00
[MINED035] Js New Function: new Function(...) compiles strings to functions.
critical SEC084 JS: require() with non-literal
packages/react-doctor/src/cli/utils/prompts.ts:24 · conf 1.00
[SEC084] JS: require() with non-literal: require(<variable>) loads arbitrary modules — equivalent to eval at module scope. Ported from eslint-plugin-security detect-non-literal-require (Apache-2.0).
high MINED031 React Direct State Mutation CWE-682
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/__fixtures__/no-direct-mutation-state.fixtures.ts:44 · conf 1.00
[MINED031] React Direct State Mutation: this.state.X = Y mutates without setState. React wont re-render.
high MINED115 GitHub Action pinned to mutable ref (not 40-char SHA) CWE-829
.github/workflows/ci.yml:20 · conf 0.90
[MINED115] Action `actions/checkout` pinned to mutable ref `@v5`: `uses: actions/checkout@v5` resolves at workflow-run time. Tags and branches can be re-pushed by the action owner; that made the tj-a…
high MINED115 GitHub Action pinned to mutable ref (not 40-char SHA) CWE-829
.github/workflows/ci.yml:23 · conf 0.90
[MINED115] Action `pnpm/action-setup` pinned to mutable ref `@v4`: `uses: pnpm/action-setup@v4` resolves at workflow-run time. Tags and branches can be re-pushed by the action owner; that made the tj…
high MINED115 GitHub Action pinned to mutable ref (not 40-char SHA) CWE-829
.github/workflows/ci.yml:25 · conf 0.90
[MINED115] Action `actions/setup-node` pinned to mutable ref `@v4`: `uses: actions/setup-node@v4` resolves at workflow-run time. Tags and branches can be re-pushed by the action owner; that made the …
high MINED115 GitHub Action pinned to mutable ref (not 40-char SHA) CWE-829
.github/workflows/update-leaderboard.yml:17 · conf 0.90
[MINED115] Action `actions/checkout` pinned to mutable ref `@v5`: `uses: actions/checkout@v5` resolves at workflow-run time. Tags and branches can be re-pushed by the action owner; that made the tj-a…
high MINED115 GitHub Action pinned to mutable ref (not 40-char SHA) CWE-829
.github/workflows/update-leaderboard.yml:20 · conf 0.90
[MINED115] Action `pnpm/action-setup` pinned to mutable ref `@v4`: `uses: pnpm/action-setup@v4` resolves at workflow-run time. Tags and branches can be re-pushed by the action owner; that made the tj…
high MINED115 GitHub Action pinned to mutable ref (not 40-char SHA) CWE-829
.github/workflows/update-leaderboard.yml:22 · conf 0.90
[MINED115] Action `actions/setup-node` pinned to mutable ref `@v4`: `uses: actions/setup-node@v4` resolves at workflow-run time. Tags and branches can be re-pushed by the action owner; that made the …
high SEC029 Server-Side Request Forgery (SSRF) — outbound HTTP from user input
packages/oxlint-plugin-react-doctor/src/plugin/rules/server/server-hoist-static-io.ts:85 · conf 1.00
[SEC029] Server-Side Request Forgery (SSRF) — outbound HTTP from user input: Outbound HTTP request to a user-controlled URL without allowlist validation. Attackers can probe internal services (169.25…
high SEC029 Server-Side Request Forgery (SSRF) — outbound HTTP from user input
packages/oxlint-plugin-react-doctor/src/plugin/rules/state-and-effects/rerender-defer-reads-hook.ts:58 · conf 1.00
[SEC029] Server-Side Request Forgery (SSRF) — outbound HTTP from user input: Outbound HTTP request to a user-controlled URL without allowlist validation. Attackers can probe internal services (169.25…
high SEC029 Server-Side Request Forgery (SSRF) — outbound HTTP from user input
packages/react-doctor/src/cli/index.ts:36 · conf 1.00
[SEC029] Server-Side Request Forgery (SSRF) — outbound HTTP from user input: Outbound HTTP request to a user-controlled URL without allowlist validation. Attackers can probe internal services (169.25…
high SEC040 innerHTML XSS — template literal with server-supplied data
packages/oxlint-plugin-react-doctor/scripts/generate-rule-registry.mjs:162 · conf 1.00
[SEC040] innerHTML XSS — template literal with server-supplied data: Setting .innerHTML with a template literal that interpolates server-supplied or user-supplied data is the canonical stored/reflect…
high SEC040 innerHTML XSS — template literal with server-supplied data
packages/oxlint-plugin-react-doctor/src/plugin/rules/bundle-size/no-barrel-import.ts:55 · conf 1.00
[SEC040] innerHTML XSS — template literal with server-supplied data: Setting .innerHTML with a template literal that interpolates server-supplied or user-supplied data is the canonical stored/reflect…
high SEC040 innerHTML XSS — template literal with server-supplied data
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/jsx-filename-extension.ts:86 · conf 1.00
[SEC040] innerHTML XSS — template literal with server-supplied data: Setting .innerHTML with a template literal that interpolates server-supplied or user-supplied data is the canonical stored/reflect…
high SEC085 JS: child_process.exec with non-literal
packages/core/src/filter-diagnostics.ts:105 · conf 1.00
[SEC085] JS: child_process.exec with non-literal: child_process.exec with user-derived input enables command injection. Ported from eslint-plugin-security detect-child-process (Apache-2.0).
high SEC085 JS: child_process.exec with non-literal
packages/core/src/is-test-file.ts:36 · conf 1.00
[SEC085] JS: child_process.exec with non-literal: child_process.exec with user-derived input enables command injection. Ported from eslint-plugin-security detect-child-process (Apache-2.0).
high SEC085 JS: child_process.exec with non-literal
packages/core/src/parse-gitattributes-linguist.ts:15 · conf 1.00
[SEC085] JS: child_process.exec with non-literal: child_process.exec with user-derived input enables command injection. Ported from eslint-plugin-security detect-child-process (Apache-2.0).
high SEC100 CORS permissive Access-Control-Allow-Origin: *
packages/website/src/app/api/score/route.ts:58 · conf 1.00
[SEC100] CORS permissive Access-Control-Allow-Origin: *: Permissive CORS policy (`*` origin) allows any website to make authenticated cross-origin requests. Especially dangerous when combined with `A…
medium AGT006 React interval is created without an explicit cleanup
packages/oxlint-plugin-react-doctor/src/plugin/constants/js.ts:239 · conf 0.78
React interval is created without an explicit cleanup
medium AGT006 React interval is created without an explicit cleanup
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/__fixtures__/rules-of-hooks.fixtures.ts:148 · conf 0.78
React interval is created without an explicit cleanup
medium AGT006 React interval is created without an explicit cleanup
packages/oxlint-plugin-react-doctor/src/plugin/rules/state-and-effects/no-effect-chain.ts:44 · conf 0.78
React interval is created without an explicit cleanup
medium AGT006 React interval is created without an explicit cleanup
packages/oxlint-plugin-react-doctor/src/plugin/rules/state-and-effects/rerender-functional-setstate.ts:37 · conf 0.78
React interval is created without an explicit cleanup
medium AUC001 [AUC001] No Repobility access matrix policy found: The repository uses web/API frameworks but does not define .repobility/access.yml or equivalent authorization documentation.
· conf 0.92
[AUC001] No Repobility access matrix policy found: The repository uses web/API frameworks but does not define .repobility/access.yml or equivalent authorization documentation.
medium SEC041 Tabnabbing — target="_blank" without rel="noopener noreferrer"
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/__fixtures__/jsx-no-target-blank.fixtures.ts:21 · conf 1.00
[SEC041] Tabnabbing — target="_blank" without rel="noopener noreferrer": <a target="_blank"> without rel="noopener noreferrer" leaks window.opener to the opened page. The opened page can then run win…
medium SEC045 eval()/exec() on stored or user-supplied data
packages/core/src/filter-diagnostics.ts:105 · conf 1.00
[SEC045] eval()/exec() on stored or user-supplied data: eval() and exec() on data — even admin-stored data — is a lateral-movement vector after any one credential compromise. Sandboxes (__builtins__ …
medium SEC045 eval()/exec() on stored or user-supplied data
packages/core/src/parse-gitattributes-linguist.ts:15 · conf 1.00
[SEC045] eval()/exec() on stored or user-supplied data: eval() and exec() on data — even admin-stored data — is a lateral-movement vector after any one credential compromise. Sandboxes (__builtins__ …
medium SEC045 eval()/exec() on stored or user-supplied data
packages/oxlint-plugin-react-doctor/src/plugin/rules/performance/no-large-animated-blur.ts:35 · conf 1.00
[SEC045] eval()/exec() on stored or user-supplied data: eval() and exec() on data — even admin-stored data — is a lateral-movement vector after any one credential compromise. Sandboxes (__builtins__ …
low AIC002 Source file name looks like an AI patch artifact
packages/oxlint-plugin-react-doctor/src/plugin/rules/a11y/img-redundant-alt.ts:1 · conf 0.62
Source file name looks like an AI patch artifact
low AIC002 Source file name looks like an AI patch artifact
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/no-redundant-should-component-update.ts:1 · conf 0.62
Source file name looks like an AI patch artifact
low AIC003 Duplicated implementation block across source files
packages/core/src/utils/list-source-files.ts:10 · conf 0.86
Duplicated implementation block across source files
low AIC003 Duplicated implementation block across source files
packages/core/vite.config.ts:9 · conf 0.86
Duplicated implementation block across source files
low AIC003 Duplicated implementation block across source files
packages/oxlint-plugin-react-doctor/src/plugin/rules/a11y/__fixtures__/no-noninteractive-element-to-interactive-role.fixtures.ts:28 · conf 0.86
Duplicated implementation block across source files
low AIC003 Duplicated implementation block across source files
packages/oxlint-plugin-react-doctor/src/plugin/rules/performance/rerender-derived-state-from-hook.ts:72 · conf 0.86
Duplicated implementation block across source files
low AIC003 Duplicated implementation block across source files
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/__fixtures__/no-did-update-set-state.fixtures.ts:1 · conf 0.86
Duplicated implementation block across source files
low AIC003 Duplicated implementation block across source files
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/__fixtures__/no-set-state.fixtures.ts:15 · conf 0.86
Duplicated implementation block across source files
low AIC003 Duplicated implementation block across source files
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/__fixtures__/no-set-state.fixtures.ts:60 · conf 0.86
Duplicated implementation block across source files
low AIC003 Duplicated implementation block across source files
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/__fixtures__/no-string-refs.fixtures.ts:61 · conf 0.86
Duplicated implementation block across source files
low AIC003 Duplicated implementation block across source files
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/__fixtures__/no-will-update-set-state.fixtures.ts:1 · conf 0.86
Duplicated implementation block across source files
low AIC003 Duplicated implementation block across source files
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/__fixtures__/no-will-update-set-state.fixtures.ts:125 · conf 0.86
Duplicated implementation block across source files
low AIC003 Duplicated implementation block across source files
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/jsx-no-new-array-as-prop.ts:356 · conf 0.86
Duplicated implementation block across source files
low AIC003 Duplicated implementation block across source files
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/jsx-no-new-function-as-prop.ts:266 · conf 0.86
Duplicated implementation block across source files
low AIC003 Duplicated implementation block across source files
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/jsx-no-new-function-as-prop.ts:578 · conf 0.86
Duplicated implementation block across source files
low AIC003 Duplicated implementation block across source files
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/jsx-no-new-object-as-prop.ts:298 · conf 0.86
Duplicated implementation block across source files
low AIC003 Duplicated implementation block across source files
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/jsx-no-new-object-as-prop.ts:326 · conf 0.86
Duplicated implementation block across source files
info MINED043 Http Not Https CWE-319
· conf 0.20
[MINED043] Http Not Https (and 1 more): Same pattern found in 1 additional files. Review if needed.
info MINED043 Http Not Https CWE-319
packages/oxlint-plugin-react-doctor/src/plugin/rules/a11y/__fixtures__/click-events-have-key-events.fixtures.ts:31 · conf 1.00
[MINED043] Http Not Https: Hardcoded http:// (not localhost) for endpoints that handle credentials or data.
info MINED043 Http Not Https CWE-319
packages/oxlint-plugin-react-doctor/src/plugin/rules/a11y/__fixtures__/interactive-supports-focus.fixtures.ts:53 · conf 1.00
[MINED043] Http Not Https: Hardcoded http:// (not localhost) for endpoints that handle credentials or data.
info MINED043 Http Not Https CWE-319
packages/oxlint-plugin-react-doctor/src/plugin/rules/a11y/__fixtures__/no-noninteractive-element-to-interactive-role.fixtures.ts:17 · conf 1.00
[MINED043] Http Not Https: Hardcoded http:// (not localhost) for endpoints that handle credentials or data.
info MINED044 Js Console Log Prod CWE-532
· conf 0.20
[MINED044] Js Console Log Prod (and 17 more): Same pattern found in 17 additional files. Review if needed.
info MINED044 Js Console Log Prod CWE-532
packages/api/src/diagnose.ts:122 · conf 1.00
[MINED044] Js Console Log Prod: console.log left in code. Should be replaced with logger or removed.
info MINED044 Js Console Log Prod CWE-532
packages/core/src/calculate-score.ts:74 · conf 1.00
[MINED044] Js Console Log Prod: console.log left in code. Should be replaced with logger or removed.
info MINED044 Js Console Log Prod CWE-532
packages/core/src/load-config.ts:10 · conf 1.00
[MINED044] Js Console Log Prod: console.log left in code. Should be replaced with logger or removed.
info MINED045 Ts Non Null Assertion CWE-476
· conf 0.20
[MINED045] Ts Non Null Assertion (and 19 more): Same pattern found in 19 additional files. Review if needed.
info MINED045 Ts Non Null Assertion CWE-476
packages/core/src/calculate-score.ts:7 · conf 1.00
[MINED045] Ts Non Null Assertion: x! asserts not null - bypasses null checks - TypeError if wrong.
info MINED045 Ts Non Null Assertion CWE-476
packages/core/src/utils/match-glob-pattern.ts:79 · conf 1.00
[MINED045] Ts Non Null Assertion: x! asserts not null - bypasses null checks - TypeError if wrong.
info MINED045 Ts Non Null Assertion CWE-476
packages/oxlint-plugin-react-doctor/src/plugin/rules/a11y/control-has-associated-label.ts:163 · conf 1.00
[MINED045] Ts Non Null Assertion: x! asserts not null - bypasses null checks - TypeError if wrong.
info MINED052 Ts Any Typed CWE-704
packages/oxlint-plugin-react-doctor/src/plugin/utils/rule-visitors.ts:10 · conf 1.00
[MINED052] Ts Any Typed: : any used as type annotation. Defeats TypeScript type safety.
info MINED053 Placeholder Default Username CWE-1392CWE-798
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/__fixtures__/jsx-no-script-url.fixtures.ts:17 · conf 1.00
[MINED053] Placeholder Default Username: [email protected] / [email protected] / admin/admin / changeme — typical AI placeholder credentials.
info MINED054 Ts As Any CWE-704
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/__fixtures__/jsx-no-constructed-context-values.fixtures.ts:91 · conf 1.00
[MINED054] Ts As Any: Casting to any (as any) bypasses type checking entirely.
info MINED054 Ts As Any CWE-704
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/__fixtures__/no-react-children.fixtures.ts:83 · conf 1.00
[MINED054] Ts As Any: Casting to any (as any) bypasses type checking entirely.
info MINED054 Ts As Any CWE-704
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/__fixtures__/only-export-components.fixtures.ts:115 · conf 1.00
[MINED054] Ts As Any: Casting to any (as any) bypasses type checking entirely.
info MINED056 React Key As Index CWE-682
· conf 0.20
[MINED056] React Key As Index (and 1 more): Same pattern found in 1 additional files. Review if needed.
info MINED056 React Key As Index CWE-682
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/__fixtures__/jsx-max-depth.fixtures.ts:94 · conf 1.00
[MINED056] React Key As Index: key={index} in map() — re-renders the wrong elements on re-order.
info MINED056 React Key As Index CWE-682
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/__fixtures__/no-array-index-key.fixtures.ts:111 · conf 1.00
[MINED056] React Key As Index: key={index} in map() — re-renders the wrong elements on re-order.
info MINED056 React Key As Index CWE-682
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/__fixtures__/no-multi-comp.fixtures.ts:37 · conf 1.00
[MINED056] React Key As Index: key={index} in map() — re-renders the wrong elements on re-order.
info MINED058 React Dangerously Set Html CWE-79
· conf 0.20
[MINED058] React Dangerously Set Html (and 7 more): Same pattern found in 7 additional files. Review if needed.
info MINED058 React Dangerously Set Html CWE-79
packages/oxlint-plugin-react-doctor/src/plugin/rules/a11y/__fixtures__/anchor-has-content.fixtures.ts:21 · conf 1.00
[MINED058] React Dangerously Set Html: dangerouslySetInnerHTML bypasses Reacts JSX escaping. Pair with DOMPurify or never use with user data.
info MINED058 React Dangerously Set Html CWE-79
packages/oxlint-plugin-react-doctor/src/plugin/rules/a11y/__fixtures__/heading-has-content.fixtures.ts:25 · conf 1.00
[MINED058] React Dangerously Set Html: dangerouslySetInnerHTML bypasses Reacts JSX escaping. Pair with DOMPurify or never use with user data.
info MINED058 React Dangerously Set Html CWE-79
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/__fixtures__/no-danger-with-children.fixtures.ts:18 · conf 1.00
[MINED058] React Dangerously Set Html: dangerouslySetInnerHTML bypasses Reacts JSX escaping. Pair with DOMPurify or never use with user data.
info MINED087 Js Always True If CWE-561
· conf 0.20
[MINED087] Js Always True If (and 1 more): Same pattern found in 1 additional files. Review if needed.
info MINED087 Js Always True If CWE-561
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/__fixtures__/no-did-mount-set-state.fixtures.ts:202 · conf 1.00
[MINED087] Js Always True If: if (true) — else branch unreachable. Likely debug residue.
info MINED087 Js Always True If CWE-561
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/__fixtures__/no-did-update-set-state.fixtures.ts:224 · conf 1.00
[MINED087] Js Always True If: if (true) — else branch unreachable. Likely debug residue.
info MINED087 Js Always True If CWE-561
packages/oxlint-plugin-react-doctor/src/plugin/rules/react-builtins/__fixtures__/no-will-update-set-state.fixtures.ts:162 · conf 1.00
[MINED087] Js Always True If: if (true) — else branch unreachable. Likely debug residue.
info MINED088 React Conditional Hook CWE-682
· conf 0.20
[MINED088] React Conditional Hook (and 14 more): Same pattern found in 14 additional files. Review if needed.
info MINED088 React Conditional Hook CWE-682
packages/oxlint-plugin-react-doctor/src/plugin/rules/js-performance/js-hoist-intl.ts:56 · conf 1.00
[MINED088] React Conditional Hook: useState/useEffect inside if/loop violates Rules of Hooks.
info MINED088 React Conditional Hook CWE-682
packages/oxlint-plugin-react-doctor/src/plugin/rules/nextjs/nextjs-no-client-fetch-for-server-data.ts:36 · conf 1.00
[MINED088] React Conditional Hook: useState/useEffect inside if/loop violates Rules of Hooks.
info MINED088 React Conditional Hook CWE-682
packages/oxlint-plugin-react-doctor/src/plugin/rules/nextjs/nextjs-no-client-side-redirect.ts:38 · conf 1.00
[MINED088] React Conditional Hook: useState/useEffect inside if/loop violates Rules of Hooks.
info SEC029 Server-Side Request Forgery (SSRF) — outbound HTTP from user input
· conf 0.20
[SEC029] Server-Side Request Forgery (SSRF) — outbound HTTP from user input (and 6 more): Same pattern found in 6 additional files. Review if needed.
info SEC040 innerHTML XSS — template literal with server-supplied data
· conf 0.20
[SEC040] innerHTML XSS — template literal with server-supplied data (and 5 more): Same pattern found in 5 additional files. Review if needed.
info SEC045 eval()/exec() on stored or user-supplied data
· conf 0.20
[SEC045] eval()/exec() on stored or user-supplied data (and 3 more): Same pattern found in 3 additional files. Review if needed.
info SEC085 JS: child_process.exec with non-literal
· conf 0.20
[SEC085] JS: child_process.exec with non-literal (and 1 more): Same pattern found in 1 additional files. Review if needed.
info SEC118 UUIDv1 / UUIDv3 used for security-sensitive identifier
packages/oxlint-plugin-react-doctor/src/plugin/rules/performance/rendering-hydration-mismatch-time.ts:55 · conf 0.10
[SEC118] UUIDv1 / UUIDv3 used for security-sensitive identifier: UUIDv1 encodes the MAC address and timestamp, making it predictable. Used as a session token or password-reset key, it's enumerable.

Reading from rp.scan + rp.finding + rp.rule (unified schema, R78 series). Legacy data path unchanged. Compare with /scan/7f6ca8ef-edea-4b7c-ab2b-cc9007a7b658/.