@critiq/rules 0.0.1 → 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.
Files changed (204) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +256 -140
  3. package/catalog.yaml +985 -19
  4. package/package.json +7 -1
  5. package/rules/go/go.performance.no-regex-construction-in-loop.rule.yaml +33 -0
  6. package/rules/go/go.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
  7. package/rules/go/go.performance.no-unbounded-concurrency.rule.yaml +33 -0
  8. package/rules/go/go.security.echo-sensitive-binding-without-validation.rule.yaml +46 -0
  9. package/rules/go/go.security.echo-unsafe-multipart-upload.rule.yaml +45 -0
  10. package/rules/go/go.security.fiber-sensitive-binding-without-validation.rule.yaml +45 -0
  11. package/rules/go/go.security.fiber-unsafe-multipart-upload.rule.yaml +45 -0
  12. package/rules/go/go.security.gin-sensitive-binding-without-validation.rule.yaml +45 -0
  13. package/rules/go/go.security.gin-trust-all-proxies.rule.yaml +45 -0
  14. package/rules/go/go.security.gin-wildcard-cors-with-credentials.rule.yaml +47 -0
  15. package/rules/go/go.security.net-http-missing-timeouts.rule.yaml +45 -0
  16. package/rules/go/go.security.sensitive-data-egress.rule.yaml +46 -0
  17. package/rules/go/go.security.tar-path-traversal.rule.yaml +45 -0
  18. package/rules/go/go.security.template-unescaped-request-value.rule.yaml +45 -0
  19. package/rules/go/go.testing.real-network-in-unit-test.rule.yaml +33 -0
  20. package/rules/go/go.testing.t-skip-without-ticket-reference.rule.yaml +33 -0
  21. package/rules/go/go.testing.time-sleep-in-unit-test.rule.yaml +33 -0
  22. package/rules/java/java.performance.no-regex-construction-in-loop.rule.yaml +33 -0
  23. package/rules/java/java.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
  24. package/rules/java/java.performance.no-unbounded-concurrency.rule.yaml +33 -0
  25. package/rules/java/java.security.android-screenshot-exposure.rule.yaml +35 -0
  26. package/rules/java/java.security.android-world-readable-mode.rule.yaml +35 -0
  27. package/rules/java/java.security.jpa-concatenated-query.rule.yaml +47 -0
  28. package/rules/java/java.security.reflected-output-from-request.rule.yaml +35 -0
  29. package/rules/java/java.security.servlet-insecure-cookie.rule.yaml +35 -0
  30. package/rules/java/java.security.spring-actuator-health-details-always.rule.yaml +40 -0
  31. package/rules/java/java.security.spring-actuator-sensitive-exposure.rule.yaml +40 -0
  32. package/rules/java/java.security.spring-csrf-globally-disabled.rule.yaml +49 -0
  33. package/rules/java/java.security.spring-debug-exposure.rule.yaml +35 -0
  34. package/rules/java/java.security.spring-permit-all-default.rule.yaml +47 -0
  35. package/rules/java/java.security.spring-webmvc-unrestricted-data-binding.rule.yaml +47 -0
  36. package/rules/java/java.security.template-unescaped-user-output.rule.yaml +49 -0
  37. package/rules/java/java.testing.disabled-without-ticket-reference.rule.yaml +33 -0
  38. package/rules/java/java.testing.http-client-in-unit-test.rule.yaml +33 -0
  39. package/rules/java/java.testing.thread-sleep-in-unit-test.rule.yaml +33 -0
  40. package/rules/php/php.performance.no-regex-construction-in-loop.rule.yaml +33 -0
  41. package/rules/php/php.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
  42. package/rules/php/php.performance.no-unbounded-concurrency.rule.yaml +33 -0
  43. package/rules/php/php.security.insecure-cors-wildcard-with-credentials.rule.yaml +41 -0
  44. package/rules/php/php.security.insecure-mail-or-file-transport.rule.yaml +41 -0
  45. package/rules/php/php.security.insecure-session-or-cookie-config.rule.yaml +42 -0
  46. package/rules/php/php.security.laravel-sensitive-csrf-exclusion.rule.yaml +42 -0
  47. package/rules/php/php.security.laravel-unsafe-blade-output.rule.yaml +42 -0
  48. package/rules/php/php.security.laravel-unsafe-mass-assignment.rule.yaml +45 -0
  49. package/rules/php/php.security.sensitive-data-egress.rule.yaml +42 -0
  50. package/rules/php/php.security.symfony-csrf-disabled.rule.yaml +42 -0
  51. package/rules/php/php.security.symfony-debug-exposure.rule.yaml +44 -0
  52. package/rules/php/php.security.unsafe-file-upload-handling.rule.yaml +41 -0
  53. package/rules/php/php.security.wordpress-missing-nonce-or-capability.rule.yaml +42 -0
  54. package/rules/php/php.security.wordpress-unprepared-sql.rule.yaml +42 -0
  55. package/rules/php/php.testing.curl-in-unit-test.rule.yaml +33 -0
  56. package/rules/php/php.testing.mark-test-skipped-without-ticket-reference.rule.yaml +33 -0
  57. package/rules/php/php.testing.sleep-in-unit-test.rule.yaml +33 -0
  58. package/rules/python/py.performance.no-regex-construction-in-loop.rule.yaml +33 -0
  59. package/rules/python/py.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
  60. package/rules/python/py.performance.no-unbounded-concurrency.rule.yaml +33 -0
  61. package/rules/python/py.security.django-csrf-exempt-state-changing.rule.yaml +46 -0
  62. package/rules/python/py.security.django-missing-csrf-middleware.rule.yaml +47 -0
  63. package/rules/python/py.security.django-unsafe-production-settings.rule.yaml +47 -0
  64. package/rules/python/py.security.drf-allow-any-default.rule.yaml +46 -0
  65. package/rules/python/py.security.drf-allow-any-unsafe-method.rule.yaml +46 -0
  66. package/rules/python/py.security.fastapi-insecure-cors.rule.yaml +43 -0
  67. package/rules/python/py.security.flask-missing-upload-body-limit.rule.yaml +44 -0
  68. package/rules/python/py.security.flask-unsafe-html-output.rule.yaml +44 -0
  69. package/rules/python/py.security.flask-unsafe-upload-filename.rule.yaml +44 -0
  70. package/rules/python/py.testing.pytest-skip-without-ticket-reference.rule.yaml +33 -0
  71. package/rules/python/py.testing.real-network-in-unit-test.rule.yaml +33 -0
  72. package/rules/python/py.testing.time-sleep-in-unit-test.rule.yaml +33 -0
  73. package/rules/ruby/ruby.performance.no-regex-construction-in-loop.rule.yaml +33 -0
  74. package/rules/ruby/ruby.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
  75. package/rules/ruby/ruby.performance.no-unbounded-concurrency.rule.yaml +33 -0
  76. package/rules/ruby/ruby.security.rails-csrf-disabled.rule.yaml +45 -0
  77. package/rules/ruby/ruby.security.rails-detailed-exceptions-enabled.rule.yaml +44 -0
  78. package/rules/ruby/ruby.security.rails-open-redirect.rule.yaml +45 -0
  79. package/rules/ruby/ruby.security.rails-unsafe-html-output.rule.yaml +46 -0
  80. package/rules/ruby/ruby.security.rails-unsafe-render.rule.yaml +45 -0
  81. package/rules/ruby/ruby.security.rails-unsafe-session-or-cookie-store.rule.yaml +45 -0
  82. package/rules/ruby/ruby.security.rails-unsafe-strong-parameters.rule.yaml +46 -0
  83. package/rules/ruby/ruby.security.sensitive-data-egress.rule.yaml +45 -0
  84. package/rules/ruby/ruby.security.sidekiq-web-unauthenticated-mount.rule.yaml +45 -0
  85. package/rules/ruby/ruby.testing.focused-example.rule.yaml +33 -0
  86. package/rules/ruby/ruby.testing.pending-without-ticket-reference.rule.yaml +33 -0
  87. package/rules/ruby/ruby.testing.real-network-in-unit-test.rule.yaml +33 -0
  88. package/rules/ruby/ruby.testing.skip-without-ticket-reference.rule.yaml +33 -0
  89. package/rules/ruby/ruby.testing.sleep-in-unit-test.rule.yaml +33 -0
  90. package/rules/rust/rust.performance.no-regex-construction-in-loop.rule.yaml +33 -0
  91. package/rules/rust/rust.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
  92. package/rules/rust/rust.performance.no-unbounded-concurrency.rule.yaml +33 -0
  93. package/rules/rust/rust.security.actix-wildcard-cors-with-credentials.rule.yaml +47 -0
  94. package/rules/rust/rust.security.axum-body-limit-disabled.rule.yaml +45 -0
  95. package/rules/rust/rust.security.axum-insecure-cors-with-credentials.rule.yaml +47 -0
  96. package/rules/rust/rust.security.rocket-panic-prone-request-handler.rule.yaml +45 -0
  97. package/rules/rust/rust.security.rocket-unsafe-template-output.rule.yaml +47 -0
  98. package/rules/rust/rust.security.sqlx-diesel-raw-interpolated-query.rule.yaml +47 -0
  99. package/rules/rust/rust.security.template-unescaped-request-value.rule.yaml +47 -0
  100. package/rules/rust/rust.security.warp-blocking-or-panic-in-async-handler.rule.yaml +45 -0
  101. package/rules/rust/rust.testing.ignore-without-ticket-reference.rule.yaml +33 -0
  102. package/rules/rust/rust.testing.real-network-in-unit-test.rule.yaml +33 -0
  103. package/rules/rust/rust.testing.thread-sleep-in-unit-test.rule.yaml +33 -0
  104. package/rules/shared/security.archive-path-traversal.rule.yaml +41 -0
  105. package/rules/shared/security.external-file-upload.rule.yaml +40 -0
  106. package/rules/shared/security.permissive-file-permissions.rule.yaml +40 -0
  107. package/rules/shared/security.sensitive-data-egress.rule.yaml +36 -0
  108. package/rules/typescript/ts.correctness.assignment-in-condition.rule.yaml +36 -0
  109. package/rules/typescript/ts.correctness.assignment-to-import-binding.rule.yaml +36 -0
  110. package/rules/typescript/ts.correctness.async-promise-executor.rule.yaml +36 -0
  111. package/rules/typescript/ts.correctness.duplicate-function-parameter.rule.yaml +36 -0
  112. package/rules/typescript/ts.correctness.duplicate-import-source.rule.yaml +36 -0
  113. package/rules/typescript/ts.correctness.duplicate-object-key.rule.yaml +36 -0
  114. package/rules/typescript/ts.correctness.duplicate-switch-case.rule.yaml +36 -0
  115. package/rules/typescript/ts.correctness.empty-block-statement.rule.yaml +35 -0
  116. package/rules/typescript/ts.correctness.identical-comparison-operands.rule.yaml +36 -0
  117. package/rules/typescript/ts.correctness.reassign-catch-binding.rule.yaml +35 -0
  118. package/rules/typescript/ts.correctness.regexp-pattern-unusual-control-character.rule.yaml +35 -0
  119. package/rules/typescript/ts.correctness.self-assignment.rule.yaml +36 -0
  120. package/rules/typescript/ts.next.server-action-missing-local-auth.rule.yaml +35 -0
  121. package/rules/typescript/ts.performance.no-array-spread-in-hot-loop.rule.yaml +32 -0
  122. package/rules/typescript/ts.performance.no-cache-miss-from-unstable-key.rule.yaml +32 -0
  123. package/rules/typescript/ts.performance.no-expensive-sort-in-render-path.rule.yaml +32 -0
  124. package/rules/typescript/ts.performance.no-json-parse-stringify-clone.rule.yaml +32 -0
  125. package/rules/typescript/ts.performance.no-large-object-spread-in-loop.rule.yaml +32 -0
  126. package/rules/typescript/ts.performance.no-n-plus-one-await-in-map.rule.yaml +32 -0
  127. package/rules/typescript/ts.performance.no-redundant-network-fetch.rule.yaml +32 -0
  128. package/rules/typescript/ts.performance.no-regex-construction-in-loop.rule.yaml +32 -0
  129. package/rules/typescript/ts.performance.no-sync-fs-in-request-path.rule.yaml +32 -0
  130. package/rules/typescript/ts.performance.no-unbounded-concurrency.rule.yaml +32 -0
  131. package/rules/typescript/ts.quality.no-ambiguous-abbreviations.rule.yaml +27 -0
  132. package/rules/typescript/ts.quality.no-barrel-file-cycle.rule.yaml +27 -0
  133. package/rules/typescript/ts.quality.no-boolean-parameter-trap.rule.yaml +27 -0
  134. package/rules/typescript/ts.quality.no-dead-export.rule.yaml +27 -0
  135. package/rules/typescript/ts.quality.no-hidden-side-effect-import.rule.yaml +27 -0
  136. package/rules/typescript/ts.quality.no-inconsistent-error-shape.rule.yaml +27 -0
  137. package/rules/typescript/ts.quality.no-mixed-abstraction-level.rule.yaml +27 -0
  138. package/rules/typescript/ts.quality.no-primitive-obsession-in-domain-model.rule.yaml +27 -0
  139. package/rules/typescript/ts.quality.no-temporal-coupling.rule.yaml +27 -0
  140. package/rules/typescript/ts.quality.no-wide-public-surface.rule.yaml +27 -0
  141. package/rules/typescript/ts.react.no-accessibility-label-missing.rule.yaml +36 -0
  142. package/rules/typescript/ts.react.no-activedescendant-on-non-focusable-host.rule.yaml +36 -0
  143. package/rules/typescript/ts.react.no-click-without-keyboard-handler.rule.yaml +36 -0
  144. package/rules/typescript/ts.react.no-deprecated-create-factory.rule.yaml +34 -0
  145. package/rules/typescript/ts.react.no-deprecated-react-dom-root-api.rule.yaml +34 -0
  146. package/rules/typescript/ts.react.no-derived-state-from-props.rule.yaml +34 -0
  147. package/rules/typescript/ts.react.no-effect-fetch-without-cancellation.rule.yaml +35 -0
  148. package/rules/typescript/ts.react.no-find-dom-node.rule.yaml +34 -0
  149. package/rules/typescript/ts.react.no-img-missing-alt-text.rule.yaml +36 -0
  150. package/rules/typescript/ts.react.no-index-as-key-in-dynamic-list.rule.yaml +34 -0
  151. package/rules/typescript/ts.react.no-interactive-role-on-static-semantics.rule.yaml +36 -0
  152. package/rules/typescript/ts.react.no-invalid-anchor-href.rule.yaml +36 -0
  153. package/rules/typescript/ts.react.no-keyboard-interaction-without-widget-role.rule.yaml +36 -0
  154. package/rules/typescript/ts.react.no-legacy-lifecycle.rule.yaml +34 -0
  155. package/rules/typescript/ts.react.no-missing-error-boundary.rule.yaml +36 -0
  156. package/rules/typescript/ts.react.no-positive-tabindex.rule.yaml +36 -0
  157. package/rules/typescript/ts.react.no-static-element-with-synthetic-handlers.rule.yaml +36 -0
  158. package/rules/typescript/ts.react.no-string-ref.rule.yaml +34 -0
  159. package/rules/typescript/ts.react.no-uncontrolled-to-controlled-input.rule.yaml +34 -0
  160. package/rules/typescript/ts.react.no-widget-role-without-tabindex.rule.yaml +36 -0
  161. package/rules/typescript/ts.security.ajv-insecure-configuration.rule.yaml +34 -0
  162. package/rules/typescript/ts.security.angular-dom-sanitizer-bypass-untrusted-input.rule.yaml +35 -0
  163. package/rules/typescript/ts.security.apollo-server-csrf-disabled.rule.yaml +36 -0
  164. package/rules/typescript/ts.security.apollo-server-graphql-dev-tooling-exposure.rule.yaml +36 -0
  165. package/rules/typescript/ts.security.apollo-server-introspection-exposure.rule.yaml +35 -0
  166. package/rules/typescript/ts.security.apollo-server-missing-query-limits.rule.yaml +35 -0
  167. package/rules/typescript/ts.security.astro-vite-public-secret-define.rule.yaml +39 -0
  168. package/rules/typescript/ts.security.debug-statement-in-source.rule.yaml +36 -0
  169. package/rules/typescript/ts.security.electron-dangerous-webpreferences.rule.yaml +35 -0
  170. package/rules/typescript/ts.security.electron-insecure-local-state.rule.yaml +35 -0
  171. package/rules/typescript/ts.security.electron-missing-ipc-origin-check.rule.yaml +35 -0
  172. package/rules/typescript/ts.security.electron-shell-open-external-unvalidated.rule.yaml +35 -0
  173. package/rules/typescript/ts.security.express-error-handler-information-disclosure.rule.yaml +35 -0
  174. package/rules/typescript/ts.security.express-static-dotfiles-allow.rule.yaml +35 -0
  175. package/rules/typescript/ts.security.express-unbounded-body-parser.rule.yaml +34 -0
  176. package/rules/typescript/ts.security.express-user-controlled-static-mount.rule.yaml +35 -0
  177. package/rules/typescript/ts.security.fastify-excessive-body-limit.rule.yaml +34 -0
  178. package/rules/typescript/ts.security.fastify-public-bind-without-trust-proxy.rule.yaml +38 -0
  179. package/rules/typescript/ts.security.graphql-upload-without-csrf-guard.rule.yaml +36 -0
  180. package/rules/typescript/ts.security.iframe-missing-sandbox-attribute.rule.yaml +35 -0
  181. package/rules/typescript/ts.security.insecure-content-security-policy-literal.rule.yaml +35 -0
  182. package/rules/typescript/ts.security.insecure-helmet-hardening-options.rule.yaml +36 -0
  183. package/rules/typescript/ts.security.jwt-insecure-signing-algorithm.rule.yaml +35 -0
  184. package/rules/typescript/ts.security.legacy-buffer-constructor.rule.yaml +35 -0
  185. package/rules/typescript/ts.security.log-injection.rule.yaml +36 -0
  186. package/rules/typescript/ts.security.nestjs-helmet-after-route-mount.rule.yaml +34 -0
  187. package/rules/typescript/ts.security.nestjs-missing-global-validation-pipe.rule.yaml +35 -0
  188. package/rules/typescript/ts.security.nestjs-skip-throttle-sensitive-route.rule.yaml +35 -0
  189. package/rules/typescript/ts.security.nestjs-validation-pipe-without-whitelist.rule.yaml +36 -0
  190. package/rules/typescript/ts.security.nuxt-public-runtime-secret.rule.yaml +38 -0
  191. package/rules/typescript/ts.security.open-redirect.rule.yaml +2 -0
  192. package/rules/typescript/ts.security.request-driven-array-index-access.rule.yaml +33 -0
  193. package/rules/typescript/ts.security.sensitive-data-egress.rule.yaml +1 -0
  194. package/rules/typescript/ts.security.ssrf.rule.yaml +1 -0
  195. package/rules/typescript/ts.security.unsafe-dompurify-version.rule.yaml +36 -0
  196. package/rules/typescript/ts.security.unsafe-marked-version.rule.yaml +36 -0
  197. package/rules/typescript/ts.security.xml-parse-string-with-untrusted-input.rule.yaml +35 -0
  198. package/rules/typescript/ts.testing.no-flaky-timer-test.rule.yaml +38 -0
  199. package/rules/typescript/ts.testing.no-focused-test.rule.yaml +34 -0
  200. package/rules/typescript/ts.testing.no-missing-edge-case-tests.rule.yaml +35 -0
  201. package/rules/typescript/ts.testing.no-network-call-in-unit-test.rule.yaml +38 -0
  202. package/rules/typescript/ts.testing.no-skipped-test-without-ticket.rule.yaml +34 -0
  203. package/rules/typescript/ts.testing.no-snapshot-without-intent.rule.yaml +34 -0
  204. 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.