shieldci/laravel
ShieldCI for Laravel brings automated security and configuration checks to your CI pipeline, helping catch risky settings, exposed debug info, and common Laravel misconfigurations before they reach production.
Architecture fit. v1.20.0 is a second consecutive additive release, but it is materially larger than v1.19.0: eight items spanning one new capability, one DX change, and six correctness fixes across five distinct checks. Two architectural notes matter. First, OriginReachabilityChecker::probeFollowingSameHost() plus the new RedirectChain value object is the first genuinely new public surface the package has shipped in this window — it extracts and formalizes redirect-following that was previously implicit, and it is consumed by both the asset/origin probe and the xss-vulnerabilities CSP check. Second, the phpstan change is a DX/diagnostic improvement (explaining an unsupported level before invocation) rather than a check-logic change, which is a welcome separation of concerns. No new services, providers, storage, or config keys are introduced.
Integration feasibility. Still a drop-in composer update — no migrations, no config publish, no consumer-facing API changes required. However, this release is more behaviorally significant than v1.19.0, and unlike v1.19.0 most of the deltas move in the direction of "fewer false positives," which is good for signal quality but bad for baseline stability. The single highest-impact item is the phpstan fix: teams that configured max were silently being evaluated at level 5, so honoring the configured level will surface a backlog of pre-existing static-analysis findings in one step. That is a correct outcome but will read as a regression to anyone not warned.
Technical risk. Low-to-moderate. No breaking changes or deprecations are announced, and every item is defensible on its own merits, but five of the eight change check outcomes:
phpstan 'max' pass-through (#504) — highest impact. Repos configured at max have been under-analyzed; they will now likely fail. Budget remediation time, not just a version bump.xss-vulnerabilities off-host redirect + unreachable-origin warning (#499) — fixes the Cloudflare Access false positive (good) but converts "could not check" from pass to warn. Combined with redirect-following, this check now depends on network reachability in a way it previously did not.missing-error-tracking reads Nightwatch flags from process environment (#498) — closes a real CI gap where .env is absent but env vars are injected; may flip failures to passes and exposes teams relying on .env-only detection.debug-mode print_r/var_export return values and debug_backtrace (#505) — removes two well-known false-positive classes. Low risk, high credibility win.config-outside-config subdomain-only marker and reserved TLDs (#506) — dev.to noise disappears; .test/.localhost/.local hosts now reported. Mixed: fewer noise findings, some new local-dev findings.Key questions.
probeFollowingSameHost()/RedirectChain intended as stable public API, and what is the redirect depth limit and cycle detection policy?phpstan fix: is the previously-forced level 5 documented anywhere, and can we get a migration note enumerating affected configs?.env, and does it cover the full flag set or only the enable/disable toggle?xss-vulnerabilities, is the new "unreachable origin" warning distinguishable from a genuine CSP finding in the report output — i.e. can we gate on severity, not just presence?Stack fit. Unchanged: Laravel/PHP, Composer-distributed, runs locally via the artisan entry point or as a CI gate alongside static analysis and dependency auditing. The phpstan fix means the package now interacts more honestly with the PHPStan stage in the same pipeline — expect correlated movement between the two stages, so sequence them deliberately.
Migration path. Do not float. Pin explicitly and upgrade in two passes:
phpstan, if the repo is configured at max, treat this as a separate remediation workstream: either fix the findings or explicitly pin a lower level in configuration, which is now finally honored rather than ignored.Compatibility. PHP/Laravel constraints assumed unchanged for a minor release; no config or migration work. The compatibility consideration is again policy: xss-vulnerabilities unreachable-origin now warns instead of passes, so any gate that fails on warnings will tighten unexpectedly. Conversely, a gate that only fails on High severity will silently loosen on the asset check. Both edges need an explicit decision.
Sequencing. Same-stage landing remains right: upgrade + policy adjustment in one change set. Across repos, pilot first — but split the pilot criteria this time. Use the pilot to (a) size the phpstan fallout, which is the only item likely to require engineering hours, and (b) confirm the redirect-following behavior doesn't lengthen pipeline runtime materially or trip egress restrictions. Roll the low-risk fixes (debug-mode, config-outside-config) broadly and immediately; hold the phpstan fix behind remediation capacity if the pilot shows a large backlog.
Maintenance. Low. Additive minor release, no deprecations, consolidated detection logic. The one new maintenance obligation is tracking the RedirectChain/probeFollowingSameHost() surface — if internal tooling wraps the checker, pin the version and review its signature in subsequent minors.
Support. The support profile shifts from "why is this failing?" to "why did this stop failing / start warning?":
max will ask why static analysis suddenly blocks them. Pre-empt with a short note: this was always the configured intent, level 5 was being enforced instead..env present) and CI (env vars only) if precedence is unclear; document which source wins.Scaling. Negligible compute, with one caveat that got slightly worse: redirect-following means each origin probe can now issue multiple HTTP requests. In large monorepos or egress-restricted runners, a slow asset host or a redirect chain that terminates at an auth gateway can extend the check's runtime. The v1.19.0 mitigation (unfetchable → warning) still applies, but verify redirect depth limits and per-request timeouts before rolling to many repos, and confirm a redirect loop cannot hang the pipeline.
Failure modes.
phpstan fallout at scale — the dominant risk. Repos pinned to max get a large, simultaneous failure wave. Largest source of "the upgrade broke the build" tickets.missing-error-tracking between local (.env) and CI (process env) if precedence is undocumented.Ramp-up. Very low for engineers — no API or configuration to learn. The onboarding burden is entirely policy and communication: document the phpstan level correction (and expect real work from it), state that warnings are now meaningful and must be reviewed, and re-pin the baseline so the team treats v1.20.0 output as the correct reference rather than noise. A single runbook page covering the phpstan change, the warning semantics, and the allowlist mechanism covers the whole release.
How can I help you explore Laravel packages today?