@critiq/rules 0.0.2 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -4
- package/catalog.yaml +985 -19
- package/package.json +6 -1
- package/rules/go/go.performance.no-regex-construction-in-loop.rule.yaml +33 -0
- package/rules/go/go.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
- package/rules/go/go.performance.no-unbounded-concurrency.rule.yaml +33 -0
- package/rules/go/go.security.echo-sensitive-binding-without-validation.rule.yaml +46 -0
- package/rules/go/go.security.echo-unsafe-multipart-upload.rule.yaml +45 -0
- package/rules/go/go.security.fiber-sensitive-binding-without-validation.rule.yaml +45 -0
- package/rules/go/go.security.fiber-unsafe-multipart-upload.rule.yaml +45 -0
- package/rules/go/go.security.gin-sensitive-binding-without-validation.rule.yaml +45 -0
- package/rules/go/go.security.gin-trust-all-proxies.rule.yaml +45 -0
- package/rules/go/go.security.gin-wildcard-cors-with-credentials.rule.yaml +47 -0
- package/rules/go/go.security.net-http-missing-timeouts.rule.yaml +45 -0
- package/rules/go/go.security.sensitive-data-egress.rule.yaml +46 -0
- package/rules/go/go.security.tar-path-traversal.rule.yaml +45 -0
- package/rules/go/go.security.template-unescaped-request-value.rule.yaml +45 -0
- package/rules/go/go.testing.real-network-in-unit-test.rule.yaml +33 -0
- package/rules/go/go.testing.t-skip-without-ticket-reference.rule.yaml +33 -0
- package/rules/go/go.testing.time-sleep-in-unit-test.rule.yaml +33 -0
- package/rules/java/java.performance.no-regex-construction-in-loop.rule.yaml +33 -0
- package/rules/java/java.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
- package/rules/java/java.performance.no-unbounded-concurrency.rule.yaml +33 -0
- package/rules/java/java.security.android-screenshot-exposure.rule.yaml +35 -0
- package/rules/java/java.security.android-world-readable-mode.rule.yaml +35 -0
- package/rules/java/java.security.jpa-concatenated-query.rule.yaml +47 -0
- package/rules/java/java.security.reflected-output-from-request.rule.yaml +35 -0
- package/rules/java/java.security.servlet-insecure-cookie.rule.yaml +35 -0
- package/rules/java/java.security.spring-actuator-health-details-always.rule.yaml +40 -0
- package/rules/java/java.security.spring-actuator-sensitive-exposure.rule.yaml +40 -0
- package/rules/java/java.security.spring-csrf-globally-disabled.rule.yaml +49 -0
- package/rules/java/java.security.spring-debug-exposure.rule.yaml +35 -0
- package/rules/java/java.security.spring-permit-all-default.rule.yaml +47 -0
- package/rules/java/java.security.spring-webmvc-unrestricted-data-binding.rule.yaml +47 -0
- package/rules/java/java.security.template-unescaped-user-output.rule.yaml +49 -0
- package/rules/java/java.testing.disabled-without-ticket-reference.rule.yaml +33 -0
- package/rules/java/java.testing.http-client-in-unit-test.rule.yaml +33 -0
- package/rules/java/java.testing.thread-sleep-in-unit-test.rule.yaml +33 -0
- package/rules/php/php.performance.no-regex-construction-in-loop.rule.yaml +33 -0
- package/rules/php/php.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
- package/rules/php/php.performance.no-unbounded-concurrency.rule.yaml +33 -0
- package/rules/php/php.security.insecure-cors-wildcard-with-credentials.rule.yaml +41 -0
- package/rules/php/php.security.insecure-mail-or-file-transport.rule.yaml +41 -0
- package/rules/php/php.security.insecure-session-or-cookie-config.rule.yaml +42 -0
- package/rules/php/php.security.laravel-sensitive-csrf-exclusion.rule.yaml +42 -0
- package/rules/php/php.security.laravel-unsafe-blade-output.rule.yaml +42 -0
- package/rules/php/php.security.laravel-unsafe-mass-assignment.rule.yaml +45 -0
- package/rules/php/php.security.sensitive-data-egress.rule.yaml +42 -0
- package/rules/php/php.security.symfony-csrf-disabled.rule.yaml +42 -0
- package/rules/php/php.security.symfony-debug-exposure.rule.yaml +44 -0
- package/rules/php/php.security.unsafe-file-upload-handling.rule.yaml +41 -0
- package/rules/php/php.security.wordpress-missing-nonce-or-capability.rule.yaml +42 -0
- package/rules/php/php.security.wordpress-unprepared-sql.rule.yaml +42 -0
- package/rules/php/php.testing.curl-in-unit-test.rule.yaml +33 -0
- package/rules/php/php.testing.mark-test-skipped-without-ticket-reference.rule.yaml +33 -0
- package/rules/php/php.testing.sleep-in-unit-test.rule.yaml +33 -0
- package/rules/python/py.performance.no-regex-construction-in-loop.rule.yaml +33 -0
- package/rules/python/py.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
- package/rules/python/py.performance.no-unbounded-concurrency.rule.yaml +33 -0
- package/rules/python/py.security.django-csrf-exempt-state-changing.rule.yaml +46 -0
- package/rules/python/py.security.django-missing-csrf-middleware.rule.yaml +47 -0
- package/rules/python/py.security.django-unsafe-production-settings.rule.yaml +47 -0
- package/rules/python/py.security.drf-allow-any-default.rule.yaml +46 -0
- package/rules/python/py.security.drf-allow-any-unsafe-method.rule.yaml +46 -0
- package/rules/python/py.security.fastapi-insecure-cors.rule.yaml +43 -0
- package/rules/python/py.security.flask-missing-upload-body-limit.rule.yaml +44 -0
- package/rules/python/py.security.flask-unsafe-html-output.rule.yaml +44 -0
- package/rules/python/py.security.flask-unsafe-upload-filename.rule.yaml +44 -0
- package/rules/python/py.testing.pytest-skip-without-ticket-reference.rule.yaml +33 -0
- package/rules/python/py.testing.real-network-in-unit-test.rule.yaml +33 -0
- package/rules/python/py.testing.time-sleep-in-unit-test.rule.yaml +33 -0
- package/rules/ruby/ruby.performance.no-regex-construction-in-loop.rule.yaml +33 -0
- package/rules/ruby/ruby.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
- package/rules/ruby/ruby.performance.no-unbounded-concurrency.rule.yaml +33 -0
- package/rules/ruby/ruby.security.rails-csrf-disabled.rule.yaml +45 -0
- package/rules/ruby/ruby.security.rails-detailed-exceptions-enabled.rule.yaml +44 -0
- package/rules/ruby/ruby.security.rails-open-redirect.rule.yaml +45 -0
- package/rules/ruby/ruby.security.rails-unsafe-html-output.rule.yaml +46 -0
- package/rules/ruby/ruby.security.rails-unsafe-render.rule.yaml +45 -0
- package/rules/ruby/ruby.security.rails-unsafe-session-or-cookie-store.rule.yaml +45 -0
- package/rules/ruby/ruby.security.rails-unsafe-strong-parameters.rule.yaml +46 -0
- package/rules/ruby/ruby.security.sensitive-data-egress.rule.yaml +45 -0
- package/rules/ruby/ruby.security.sidekiq-web-unauthenticated-mount.rule.yaml +45 -0
- package/rules/ruby/ruby.testing.focused-example.rule.yaml +33 -0
- package/rules/ruby/ruby.testing.pending-without-ticket-reference.rule.yaml +33 -0
- package/rules/ruby/ruby.testing.real-network-in-unit-test.rule.yaml +33 -0
- package/rules/ruby/ruby.testing.skip-without-ticket-reference.rule.yaml +33 -0
- package/rules/ruby/ruby.testing.sleep-in-unit-test.rule.yaml +33 -0
- package/rules/rust/rust.performance.no-regex-construction-in-loop.rule.yaml +33 -0
- package/rules/rust/rust.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
- package/rules/rust/rust.performance.no-unbounded-concurrency.rule.yaml +33 -0
- package/rules/rust/rust.security.actix-wildcard-cors-with-credentials.rule.yaml +47 -0
- package/rules/rust/rust.security.axum-body-limit-disabled.rule.yaml +45 -0
- package/rules/rust/rust.security.axum-insecure-cors-with-credentials.rule.yaml +47 -0
- package/rules/rust/rust.security.rocket-panic-prone-request-handler.rule.yaml +45 -0
- package/rules/rust/rust.security.rocket-unsafe-template-output.rule.yaml +47 -0
- package/rules/rust/rust.security.sqlx-diesel-raw-interpolated-query.rule.yaml +47 -0
- package/rules/rust/rust.security.template-unescaped-request-value.rule.yaml +47 -0
- package/rules/rust/rust.security.warp-blocking-or-panic-in-async-handler.rule.yaml +45 -0
- package/rules/rust/rust.testing.ignore-without-ticket-reference.rule.yaml +33 -0
- package/rules/rust/rust.testing.real-network-in-unit-test.rule.yaml +33 -0
- package/rules/rust/rust.testing.thread-sleep-in-unit-test.rule.yaml +33 -0
- package/rules/shared/security.archive-path-traversal.rule.yaml +41 -0
- package/rules/shared/security.external-file-upload.rule.yaml +40 -0
- package/rules/shared/security.permissive-file-permissions.rule.yaml +40 -0
- package/rules/shared/security.sensitive-data-egress.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.assignment-in-condition.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.assignment-to-import-binding.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.async-promise-executor.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.duplicate-function-parameter.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.duplicate-import-source.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.duplicate-object-key.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.duplicate-switch-case.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.empty-block-statement.rule.yaml +35 -0
- package/rules/typescript/ts.correctness.identical-comparison-operands.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.reassign-catch-binding.rule.yaml +35 -0
- package/rules/typescript/ts.correctness.regexp-pattern-unusual-control-character.rule.yaml +35 -0
- package/rules/typescript/ts.correctness.self-assignment.rule.yaml +36 -0
- package/rules/typescript/ts.next.server-action-missing-local-auth.rule.yaml +35 -0
- package/rules/typescript/ts.performance.no-array-spread-in-hot-loop.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-cache-miss-from-unstable-key.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-expensive-sort-in-render-path.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-json-parse-stringify-clone.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-large-object-spread-in-loop.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-n-plus-one-await-in-map.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-redundant-network-fetch.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-regex-construction-in-loop.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-sync-fs-in-request-path.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-unbounded-concurrency.rule.yaml +32 -0
- package/rules/typescript/ts.quality.no-ambiguous-abbreviations.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-barrel-file-cycle.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-boolean-parameter-trap.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-dead-export.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-hidden-side-effect-import.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-inconsistent-error-shape.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-mixed-abstraction-level.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-primitive-obsession-in-domain-model.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-temporal-coupling.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-wide-public-surface.rule.yaml +27 -0
- package/rules/typescript/ts.react.no-accessibility-label-missing.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-activedescendant-on-non-focusable-host.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-click-without-keyboard-handler.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-deprecated-create-factory.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-deprecated-react-dom-root-api.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-derived-state-from-props.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-effect-fetch-without-cancellation.rule.yaml +35 -0
- package/rules/typescript/ts.react.no-find-dom-node.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-img-missing-alt-text.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-index-as-key-in-dynamic-list.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-interactive-role-on-static-semantics.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-invalid-anchor-href.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-keyboard-interaction-without-widget-role.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-legacy-lifecycle.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-missing-error-boundary.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-positive-tabindex.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-static-element-with-synthetic-handlers.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-string-ref.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-uncontrolled-to-controlled-input.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-widget-role-without-tabindex.rule.yaml +36 -0
- package/rules/typescript/ts.security.ajv-insecure-configuration.rule.yaml +34 -0
- package/rules/typescript/ts.security.angular-dom-sanitizer-bypass-untrusted-input.rule.yaml +35 -0
- package/rules/typescript/ts.security.apollo-server-csrf-disabled.rule.yaml +36 -0
- package/rules/typescript/ts.security.apollo-server-graphql-dev-tooling-exposure.rule.yaml +36 -0
- package/rules/typescript/ts.security.apollo-server-introspection-exposure.rule.yaml +35 -0
- package/rules/typescript/ts.security.apollo-server-missing-query-limits.rule.yaml +35 -0
- package/rules/typescript/ts.security.astro-vite-public-secret-define.rule.yaml +39 -0
- package/rules/typescript/ts.security.debug-statement-in-source.rule.yaml +36 -0
- package/rules/typescript/ts.security.electron-dangerous-webpreferences.rule.yaml +35 -0
- package/rules/typescript/ts.security.electron-insecure-local-state.rule.yaml +35 -0
- package/rules/typescript/ts.security.electron-missing-ipc-origin-check.rule.yaml +35 -0
- package/rules/typescript/ts.security.electron-shell-open-external-unvalidated.rule.yaml +35 -0
- package/rules/typescript/ts.security.express-error-handler-information-disclosure.rule.yaml +35 -0
- package/rules/typescript/ts.security.express-static-dotfiles-allow.rule.yaml +35 -0
- package/rules/typescript/ts.security.express-unbounded-body-parser.rule.yaml +34 -0
- package/rules/typescript/ts.security.express-user-controlled-static-mount.rule.yaml +35 -0
- package/rules/typescript/ts.security.fastify-excessive-body-limit.rule.yaml +34 -0
- package/rules/typescript/ts.security.fastify-public-bind-without-trust-proxy.rule.yaml +38 -0
- package/rules/typescript/ts.security.graphql-upload-without-csrf-guard.rule.yaml +36 -0
- package/rules/typescript/ts.security.iframe-missing-sandbox-attribute.rule.yaml +35 -0
- package/rules/typescript/ts.security.insecure-content-security-policy-literal.rule.yaml +35 -0
- package/rules/typescript/ts.security.insecure-helmet-hardening-options.rule.yaml +36 -0
- package/rules/typescript/ts.security.jwt-insecure-signing-algorithm.rule.yaml +35 -0
- package/rules/typescript/ts.security.legacy-buffer-constructor.rule.yaml +35 -0
- package/rules/typescript/ts.security.log-injection.rule.yaml +36 -0
- package/rules/typescript/ts.security.nestjs-helmet-after-route-mount.rule.yaml +34 -0
- package/rules/typescript/ts.security.nestjs-missing-global-validation-pipe.rule.yaml +35 -0
- package/rules/typescript/ts.security.nestjs-skip-throttle-sensitive-route.rule.yaml +35 -0
- package/rules/typescript/ts.security.nestjs-validation-pipe-without-whitelist.rule.yaml +36 -0
- package/rules/typescript/ts.security.nuxt-public-runtime-secret.rule.yaml +38 -0
- package/rules/typescript/ts.security.open-redirect.rule.yaml +2 -0
- package/rules/typescript/ts.security.request-driven-array-index-access.rule.yaml +33 -0
- package/rules/typescript/ts.security.sensitive-data-egress.rule.yaml +1 -0
- package/rules/typescript/ts.security.ssrf.rule.yaml +1 -0
- package/rules/typescript/ts.security.unsafe-dompurify-version.rule.yaml +36 -0
- package/rules/typescript/ts.security.unsafe-marked-version.rule.yaml +36 -0
- package/rules/typescript/ts.security.xml-parse-string-with-untrusted-input.rule.yaml +35 -0
- package/rules/typescript/ts.testing.no-flaky-timer-test.rule.yaml +38 -0
- package/rules/typescript/ts.testing.no-focused-test.rule.yaml +34 -0
- package/rules/typescript/ts.testing.no-missing-edge-case-tests.rule.yaml +35 -0
- package/rules/typescript/ts.testing.no-network-call-in-unit-test.rule.yaml +38 -0
- package/rules/typescript/ts.testing.no-skipped-test-without-ticket.rule.yaml +34 -0
- package/rules/typescript/ts.testing.no-snapshot-without-intent.rule.yaml +34 -0
- package/rules/typescript/ts.testing.no-test-only-code-in-production.rule.yaml +38 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: java.testing.disabled-without-ticket-reference
|
|
5
|
+
title: JUnit @Disabled should cite a ticket
|
|
6
|
+
summary: Disabled tests without a reason string or nearby tracker note are hard to triage.
|
|
7
|
+
rationale: Disabled tests should carry reviewable intent.
|
|
8
|
+
tags:
|
|
9
|
+
- testing
|
|
10
|
+
- java
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- java
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: java.testing.disabled-without-ticket-reference
|
|
20
|
+
bind: issue
|
|
21
|
+
emit:
|
|
22
|
+
finding:
|
|
23
|
+
category: quality.testing
|
|
24
|
+
severity: medium
|
|
25
|
+
confidence: 0.64
|
|
26
|
+
tags:
|
|
27
|
+
- testing
|
|
28
|
+
- java
|
|
29
|
+
message:
|
|
30
|
+
title: Add a reason or ticket to `${captures.issue.text}`
|
|
31
|
+
summary: "`@Disabled` is used without a documented reason containing a tracker reference."
|
|
32
|
+
remediation:
|
|
33
|
+
summary: Add `@Disabled("JIRA-123 ...")` or a nearby suppression comment with an issue id.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: java.testing.http-client-in-unit-test
|
|
5
|
+
title: Avoid live HTTP clients in Java unit tests
|
|
6
|
+
summary: HttpClient/URL/RestTemplate usage in unit tests should target fakes or embedded servers.
|
|
7
|
+
rationale: Live HTTP couples CI to the network.
|
|
8
|
+
tags:
|
|
9
|
+
- testing
|
|
10
|
+
- java
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- java
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: java.testing.http-client-in-unit-test
|
|
20
|
+
bind: issue
|
|
21
|
+
emit:
|
|
22
|
+
finding:
|
|
23
|
+
category: quality.testing
|
|
24
|
+
severity: medium
|
|
25
|
+
confidence: 0.62
|
|
26
|
+
tags:
|
|
27
|
+
- testing
|
|
28
|
+
- java
|
|
29
|
+
message:
|
|
30
|
+
title: Stub outbound HTTP in `${captures.issue.text}`
|
|
31
|
+
summary: "`${captures.issue.text}` references a live HTTP client inside a `*Test.java` file."
|
|
32
|
+
remediation:
|
|
33
|
+
summary: Use MockWebServer, WireMock, or injected clients with deterministic responses.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: java.testing.thread-sleep-in-unit-test
|
|
5
|
+
title: Avoid Thread.sleep in Java unit tests
|
|
6
|
+
summary: Sleeping in tests slows CI and hides synchronization bugs.
|
|
7
|
+
rationale: Prefer Awaitility, latches, or deterministic test doubles.
|
|
8
|
+
tags:
|
|
9
|
+
- testing
|
|
10
|
+
- java
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- java
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: java.testing.thread-sleep-in-unit-test
|
|
20
|
+
bind: issue
|
|
21
|
+
emit:
|
|
22
|
+
finding:
|
|
23
|
+
category: quality.testing
|
|
24
|
+
severity: low
|
|
25
|
+
confidence: 0.6
|
|
26
|
+
tags:
|
|
27
|
+
- testing
|
|
28
|
+
- java
|
|
29
|
+
message:
|
|
30
|
+
title: Replace `Thread.sleep` in unit tests
|
|
31
|
+
summary: "`${captures.issue.text}` blocks on real wall-clock time inside a `*Test.java` file."
|
|
32
|
+
remediation:
|
|
33
|
+
summary: Use synchronization primitives, timeouts with polling, or move timing coverage to integration tests.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: php.performance.no-regex-construction-in-loop
|
|
5
|
+
title: Avoid no regex construction in loop
|
|
6
|
+
summary: Performance hygiene signal for php sources.
|
|
7
|
+
rationale: Performance hygiene signal for php sources.
|
|
8
|
+
tags:
|
|
9
|
+
- performance
|
|
10
|
+
- php
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- php
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: php.performance.no-regex-construction-in-loop
|
|
20
|
+
bind: issue
|
|
21
|
+
emit:
|
|
22
|
+
finding:
|
|
23
|
+
category: performance.allocation
|
|
24
|
+
severity: medium
|
|
25
|
+
confidence: 0.66
|
|
26
|
+
tags:
|
|
27
|
+
- performance
|
|
28
|
+
- php
|
|
29
|
+
message:
|
|
30
|
+
title: Avoid no regex construction in loop in `php` code
|
|
31
|
+
summary: "`${captures.issue.text}` matches php.performance.no-regex-construction-in-loop."
|
|
32
|
+
remediation:
|
|
33
|
+
summary: Refactor this path to reduce avoidable runtime overhead.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: php.performance.no-sync-fs-in-request-path
|
|
5
|
+
title: Avoid no sync fs in request path
|
|
6
|
+
summary: Performance hygiene signal for php sources.
|
|
7
|
+
rationale: Performance hygiene signal for php sources.
|
|
8
|
+
tags:
|
|
9
|
+
- performance
|
|
10
|
+
- php
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- php
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: php.performance.no-sync-fs-in-request-path
|
|
20
|
+
bind: issue
|
|
21
|
+
emit:
|
|
22
|
+
finding:
|
|
23
|
+
category: performance.io
|
|
24
|
+
severity: high
|
|
25
|
+
confidence: 0.66
|
|
26
|
+
tags:
|
|
27
|
+
- performance
|
|
28
|
+
- php
|
|
29
|
+
message:
|
|
30
|
+
title: Avoid no sync fs in request path in `php` code
|
|
31
|
+
summary: "`${captures.issue.text}` matches php.performance.no-sync-fs-in-request-path."
|
|
32
|
+
remediation:
|
|
33
|
+
summary: Refactor this path to reduce avoidable runtime overhead.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: php.performance.no-unbounded-concurrency
|
|
5
|
+
title: Avoid no unbounded concurrency
|
|
6
|
+
summary: Performance hygiene signal for php sources.
|
|
7
|
+
rationale: Performance hygiene signal for php sources.
|
|
8
|
+
tags:
|
|
9
|
+
- performance
|
|
10
|
+
- php
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- php
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: php.performance.no-unbounded-concurrency
|
|
20
|
+
bind: issue
|
|
21
|
+
emit:
|
|
22
|
+
finding:
|
|
23
|
+
category: performance.async
|
|
24
|
+
severity: medium
|
|
25
|
+
confidence: 0.66
|
|
26
|
+
tags:
|
|
27
|
+
- performance
|
|
28
|
+
- php
|
|
29
|
+
message:
|
|
30
|
+
title: Avoid no unbounded concurrency in `php` code
|
|
31
|
+
summary: "`${captures.issue.text}` matches php.performance.no-unbounded-concurrency."
|
|
32
|
+
remediation:
|
|
33
|
+
summary: Refactor this path to reduce avoidable runtime overhead.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: php.security.insecure-cors-wildcard-with-credentials
|
|
5
|
+
title: Do not combine wildcard CORS origin with credentials
|
|
6
|
+
summary: >-
|
|
7
|
+
PHP CORS responses should not allow credentials when origin is set to `*`.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Wildcard origins with credential support break origin isolation and can expose authenticated data cross-site.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- php
|
|
13
|
+
- cors
|
|
14
|
+
- rules-catalog
|
|
15
|
+
stability: stable
|
|
16
|
+
appliesTo: block
|
|
17
|
+
scope:
|
|
18
|
+
languages:
|
|
19
|
+
- php
|
|
20
|
+
paths:
|
|
21
|
+
include:
|
|
22
|
+
- "**/*.php"
|
|
23
|
+
match:
|
|
24
|
+
fact:
|
|
25
|
+
kind: php.security.insecure-cors-wildcard-with-credentials
|
|
26
|
+
bind: issue
|
|
27
|
+
emit:
|
|
28
|
+
finding:
|
|
29
|
+
category: security.data-exposure
|
|
30
|
+
severity: high
|
|
31
|
+
confidence: 0.85
|
|
32
|
+
tags:
|
|
33
|
+
- security
|
|
34
|
+
- php
|
|
35
|
+
- cors
|
|
36
|
+
message:
|
|
37
|
+
title: Fix unsafe CORS configuration in `${captures.issue.text}`
|
|
38
|
+
summary: "`${captures.issue.text}` allows wildcard origin and credentials together."
|
|
39
|
+
remediation:
|
|
40
|
+
summary: >-
|
|
41
|
+
Replace wildcard origins with explicit allowlists and keep credentials disabled unless strictly required.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: php.security.insecure-mail-or-file-transport
|
|
5
|
+
title: Avoid insecure PHP FTP/SMTP or plaintext transport patterns
|
|
6
|
+
summary: >-
|
|
7
|
+
Outbound mail/file transfer code should not rely on plaintext transport endpoints for sensitive traffic.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Unencrypted transfer channels expose credentials and payloads to interception or tampering.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- php
|
|
13
|
+
- transport
|
|
14
|
+
- rules-catalog
|
|
15
|
+
stability: experimental
|
|
16
|
+
appliesTo: block
|
|
17
|
+
scope:
|
|
18
|
+
languages:
|
|
19
|
+
- php
|
|
20
|
+
paths:
|
|
21
|
+
include:
|
|
22
|
+
- "**/*.php"
|
|
23
|
+
match:
|
|
24
|
+
fact:
|
|
25
|
+
kind: php.security.insecure-mail-or-file-transport
|
|
26
|
+
bind: issue
|
|
27
|
+
emit:
|
|
28
|
+
finding:
|
|
29
|
+
category: security.network
|
|
30
|
+
severity: medium
|
|
31
|
+
confidence: 0.72
|
|
32
|
+
tags:
|
|
33
|
+
- security
|
|
34
|
+
- php
|
|
35
|
+
- transport
|
|
36
|
+
message:
|
|
37
|
+
title: Prefer encrypted transport in `${captures.issue.text}`
|
|
38
|
+
summary: "`${captures.issue.text}` uses plaintext FTP/SMTP/HTTP transport for potentially sensitive operations."
|
|
39
|
+
remediation:
|
|
40
|
+
summary: >-
|
|
41
|
+
Use encrypted transport endpoints and modern client libraries with certificate validation enabled.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: php.security.insecure-session-or-cookie-config
|
|
5
|
+
title: Harden PHP session and cookie security flags
|
|
6
|
+
summary: >-
|
|
7
|
+
Session/cookie configuration should keep secure, httpOnly, and safe same-site posture for authenticated contexts.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Weak cookie/session flags increase theft and replay risk across XSS, mixed transport, and cross-site request contexts.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- php
|
|
13
|
+
- session
|
|
14
|
+
- cookies
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: experimental
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- php
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.php"
|
|
24
|
+
match:
|
|
25
|
+
fact:
|
|
26
|
+
kind: php.security.insecure-session-or-cookie-config
|
|
27
|
+
bind: issue
|
|
28
|
+
emit:
|
|
29
|
+
finding:
|
|
30
|
+
category: security.session-management
|
|
31
|
+
severity: medium
|
|
32
|
+
confidence: 0.76
|
|
33
|
+
tags:
|
|
34
|
+
- security
|
|
35
|
+
- php
|
|
36
|
+
- session
|
|
37
|
+
message:
|
|
38
|
+
title: Tighten cookie/session configuration in `${captures.issue.text}`
|
|
39
|
+
summary: "`${captures.issue.text}` configures cookies or sessions with insecure defaults."
|
|
40
|
+
remediation:
|
|
41
|
+
summary: >-
|
|
42
|
+
Set `secure=true`, `httponly=true`, and a restrictive same-site policy for authentication cookies in production traffic.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: php.security.laravel-sensitive-csrf-exclusion
|
|
5
|
+
title: Avoid broad Laravel CSRF exclusions on sensitive routes
|
|
6
|
+
summary: >-
|
|
7
|
+
Wildcard CSRF exclusions should not cover account, billing, admin, password, or profile endpoints.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Over-broad CSRF exemptions remove request integrity checks from high-impact authenticated actions.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- php
|
|
13
|
+
- laravel
|
|
14
|
+
- csrf
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: stable
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- php
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.php"
|
|
24
|
+
match:
|
|
25
|
+
fact:
|
|
26
|
+
kind: php.security.laravel-sensitive-csrf-exclusion
|
|
27
|
+
bind: issue
|
|
28
|
+
emit:
|
|
29
|
+
finding:
|
|
30
|
+
category: security.session-management
|
|
31
|
+
severity: high
|
|
32
|
+
confidence: 0.86
|
|
33
|
+
tags:
|
|
34
|
+
- security
|
|
35
|
+
- php
|
|
36
|
+
- laravel
|
|
37
|
+
message:
|
|
38
|
+
title: Narrow CSRF exclusions near `${captures.issue.text}`
|
|
39
|
+
summary: "`${captures.issue.text}` exempts sensitive route patterns from CSRF verification."
|
|
40
|
+
remediation:
|
|
41
|
+
summary: >-
|
|
42
|
+
Limit CSRF exceptions to explicitly signed webhook endpoints and avoid wildcard exclusions on authenticated user flows.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: php.security.laravel-unsafe-blade-output
|
|
5
|
+
title: Avoid unescaped Laravel Blade output from request or model data
|
|
6
|
+
summary: >-
|
|
7
|
+
Raw Blade rendering (`{!! !!}`) should not directly render request, model, or translated user content.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Unescaped template output can enable stored or reflected XSS when user-controlled values are rendered as HTML.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- php
|
|
13
|
+
- laravel
|
|
14
|
+
- xss
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: stable
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- php
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.php"
|
|
24
|
+
match:
|
|
25
|
+
fact:
|
|
26
|
+
kind: php.security.laravel-unsafe-blade-output
|
|
27
|
+
bind: issue
|
|
28
|
+
emit:
|
|
29
|
+
finding:
|
|
30
|
+
category: security.input-validation
|
|
31
|
+
severity: high
|
|
32
|
+
confidence: 0.84
|
|
33
|
+
tags:
|
|
34
|
+
- security
|
|
35
|
+
- php
|
|
36
|
+
- laravel
|
|
37
|
+
message:
|
|
38
|
+
title: Escape template output in `${captures.issue.text}`
|
|
39
|
+
summary: "`${captures.issue.text}` emits raw HTML from potentially untrusted values."
|
|
40
|
+
remediation:
|
|
41
|
+
summary: >-
|
|
42
|
+
Prefer escaped Blade output (`{{ }}`) and sanitizer wrappers before rendering user-influenced HTML.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: php.security.laravel-unsafe-mass-assignment
|
|
5
|
+
title: Avoid mass-assigning full Laravel request payloads
|
|
6
|
+
summary: >-
|
|
7
|
+
Eloquent writes should not use `$request->all()` or fully unguarded models for sensitive records.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Raw request mass assignment lets attackers set privileged fields like role or account ownership.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- php
|
|
13
|
+
- laravel
|
|
14
|
+
- mass-assignment
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: stable
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- php
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.php"
|
|
24
|
+
exclude:
|
|
25
|
+
- "**/vendor/**"
|
|
26
|
+
- "**/node_modules/**"
|
|
27
|
+
match:
|
|
28
|
+
fact:
|
|
29
|
+
kind: php.security.laravel-unsafe-mass-assignment
|
|
30
|
+
bind: issue
|
|
31
|
+
emit:
|
|
32
|
+
finding:
|
|
33
|
+
category: security.authorization
|
|
34
|
+
severity: high
|
|
35
|
+
confidence: 0.9
|
|
36
|
+
tags:
|
|
37
|
+
- security
|
|
38
|
+
- php
|
|
39
|
+
- laravel
|
|
40
|
+
message:
|
|
41
|
+
title: Restrict model assignment in `${captures.issue.text}`
|
|
42
|
+
summary: "`${captures.issue.text}` writes unfiltered request attributes into a model."
|
|
43
|
+
remediation:
|
|
44
|
+
summary: >-
|
|
45
|
+
Use validated DTO/request objects and explicit allowlists (`only`) for model writes, and avoid `$guarded = []` on sensitive models.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: php.security.sensitive-data-egress
|
|
5
|
+
title: Avoid relaying request-derived sensitive data in outbound PHP HTTP calls
|
|
6
|
+
summary: >-
|
|
7
|
+
Outbound HTTP clients should not forward tainted request/session material without validation or redaction.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Unchecked egress forwarding can leak tokens, credentials, or personal data to external systems.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- php
|
|
13
|
+
- privacy
|
|
14
|
+
- egress
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: experimental
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- php
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.php"
|
|
24
|
+
match:
|
|
25
|
+
fact:
|
|
26
|
+
kind: security.sensitive-data-egress
|
|
27
|
+
bind: issue
|
|
28
|
+
emit:
|
|
29
|
+
finding:
|
|
30
|
+
category: security.privacy
|
|
31
|
+
severity: high
|
|
32
|
+
confidence: 0.78
|
|
33
|
+
tags:
|
|
34
|
+
- security
|
|
35
|
+
- php
|
|
36
|
+
- privacy
|
|
37
|
+
message:
|
|
38
|
+
title: Validate outbound payloads in `${captures.issue.text}`
|
|
39
|
+
summary: "`${captures.issue.text}` forwards tainted or sensitive values to an external HTTP client."
|
|
40
|
+
remediation:
|
|
41
|
+
summary: >-
|
|
42
|
+
Scrub secrets, restrict outbound destinations, and centralize external integrations behind audited request builders.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: php.security.symfony-csrf-disabled
|
|
5
|
+
title: Keep Symfony CSRF enabled on state-changing form flows
|
|
6
|
+
summary: >-
|
|
7
|
+
Symfony forms and controllers handling state changes should not disable CSRF protection without a clear API token boundary.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Disabling CSRF for authenticated browser flows enables cross-site request forgery on sensitive actions.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- php
|
|
13
|
+
- symfony
|
|
14
|
+
- csrf
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: stable
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- php
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.php"
|
|
24
|
+
match:
|
|
25
|
+
fact:
|
|
26
|
+
kind: php.security.symfony-csrf-disabled
|
|
27
|
+
bind: issue
|
|
28
|
+
emit:
|
|
29
|
+
finding:
|
|
30
|
+
category: security.session-management
|
|
31
|
+
severity: high
|
|
32
|
+
confidence: 0.84
|
|
33
|
+
tags:
|
|
34
|
+
- security
|
|
35
|
+
- php
|
|
36
|
+
- symfony
|
|
37
|
+
message:
|
|
38
|
+
title: Re-enable CSRF guard around `${captures.issue.text}`
|
|
39
|
+
summary: "`${captures.issue.text}` disables CSRF protection for a state-changing Symfony surface."
|
|
40
|
+
remediation:
|
|
41
|
+
summary: >-
|
|
42
|
+
Keep CSRF enabled for browser forms/controllers and only exempt endpoints that are explicitly authenticated by signed tokens.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: php.security.symfony-debug-exposure
|
|
5
|
+
title: Disable Symfony debug and profiler in production-like configs
|
|
6
|
+
summary: >-
|
|
7
|
+
Production-like Symfony configuration should not enable debug mode or web profiler surfaces.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Debug and profiler exposure can leak internals, stack traces, secrets, and request details.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- php
|
|
13
|
+
- symfony
|
|
14
|
+
- debug
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: stable
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- php
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.php"
|
|
24
|
+
- "**/.env"
|
|
25
|
+
- "**/.env.*"
|
|
26
|
+
match:
|
|
27
|
+
fact:
|
|
28
|
+
kind: php.security.symfony-debug-exposure
|
|
29
|
+
bind: issue
|
|
30
|
+
emit:
|
|
31
|
+
finding:
|
|
32
|
+
category: security.information-leakage
|
|
33
|
+
severity: high
|
|
34
|
+
confidence: 0.88
|
|
35
|
+
tags:
|
|
36
|
+
- security
|
|
37
|
+
- php
|
|
38
|
+
- symfony
|
|
39
|
+
message:
|
|
40
|
+
title: Disable debug exposure in `${captures.issue.text}`
|
|
41
|
+
summary: "`${captures.issue.text}` enables Symfony debug or profiler behavior in a production-like surface."
|
|
42
|
+
remediation:
|
|
43
|
+
summary: >-
|
|
44
|
+
Keep `APP_DEBUG=0` in production and disable profiler bundles/toolbars outside local dev/test environments.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: php.security.unsafe-file-upload-handling
|
|
5
|
+
title: Validate uploaded filenames and content before storing files
|
|
6
|
+
summary: >-
|
|
7
|
+
PHP upload handlers should not persist raw `$_FILES` names without validation and normalization.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Unsafely handled uploads can enable path traversal, executable file placement, and malicious payload storage.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- php
|
|
13
|
+
- file-upload
|
|
14
|
+
- rules-catalog
|
|
15
|
+
stability: stable
|
|
16
|
+
appliesTo: block
|
|
17
|
+
scope:
|
|
18
|
+
languages:
|
|
19
|
+
- php
|
|
20
|
+
paths:
|
|
21
|
+
include:
|
|
22
|
+
- "**/*.php"
|
|
23
|
+
match:
|
|
24
|
+
fact:
|
|
25
|
+
kind: php.security.unsafe-file-upload-handling
|
|
26
|
+
bind: issue
|
|
27
|
+
emit:
|
|
28
|
+
finding:
|
|
29
|
+
category: security.input-validation
|
|
30
|
+
severity: high
|
|
31
|
+
confidence: 0.86
|
|
32
|
+
tags:
|
|
33
|
+
- security
|
|
34
|
+
- php
|
|
35
|
+
- file-upload
|
|
36
|
+
message:
|
|
37
|
+
title: Harden upload handling in `${captures.issue.text}`
|
|
38
|
+
summary: "`${captures.issue.text}` stores uploaded files without strong filename/content validation."
|
|
39
|
+
remediation:
|
|
40
|
+
summary: >-
|
|
41
|
+
Normalize filenames, enforce extension and MIME allowlists, and route uploads through dedicated validated storage helpers.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: php.security.wordpress-missing-nonce-or-capability
|
|
5
|
+
title: Require nonce and capability checks in sensitive WordPress mutation callbacks
|
|
6
|
+
summary: >-
|
|
7
|
+
WordPress admin/AJAX mutation callbacks should verify nonce tokens and enforce capability checks.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Missing nonce or authorization checks let attackers trigger privileged actions through forged or unauthorized requests.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- php
|
|
13
|
+
- wordpress
|
|
14
|
+
- authorization
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: stable
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- php
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.php"
|
|
24
|
+
match:
|
|
25
|
+
fact:
|
|
26
|
+
kind: php.security.wordpress-missing-nonce-or-capability
|
|
27
|
+
bind: issue
|
|
28
|
+
emit:
|
|
29
|
+
finding:
|
|
30
|
+
category: security.authorization
|
|
31
|
+
severity: high
|
|
32
|
+
confidence: 0.9
|
|
33
|
+
tags:
|
|
34
|
+
- security
|
|
35
|
+
- php
|
|
36
|
+
- wordpress
|
|
37
|
+
message:
|
|
38
|
+
title: Protect WordPress action `${captures.issue.text}`
|
|
39
|
+
summary: "`${captures.issue.text}` handles a mutation callback without complete nonce and capability enforcement."
|
|
40
|
+
remediation:
|
|
41
|
+
summary: >-
|
|
42
|
+
Add nonce verification (`check_ajax_referer`/`check_admin_referer`) and explicit capability checks (`current_user_can`) before performing mutations.
|