fix: Bump express-rate-limit from 8.3.1 to 8.7.0 - #10672
Conversation
|
🚀 Thanks for opening this pull request! We appreciate your effort in improving the project. Please let us know once your pull request is ready for review. Tip
Note Please respond to review comments from AI agents just like you would to comments from a human reviewer. Let the reviewer resolve their own comments, unless they have reviewed and accepted your commit, or agreed with your explanation for why the feedback was incorrect. Caution Pull requests must be written using an AI agent with human supervision. Pull requests written entirely by a human will likely be rejected, because of lower code quality, higher review effort and the higher risk of introducing bugs. Please note that AI review comments on this pull request alone do not satisfy this requirement. Our CI and AI review are safeguards, not development tools. If many issues are flagged, rethink your development approach. Invest more effort in planning and design rather than using review cycles to fix low-quality code. |
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Essentials Run ID: 📒 Files selected for processing (1)
Included review availability: Your plan provides up to 10 included reviews per hour; 7 remain after this review. 📝 WalkthroughWalkthroughThis pull request updates ChangesDependency bump
Priority: ⬆️ High Estimated code review effort: 2 (Simple) | ~10 minutes Merge Risk: ⚪ Minimal · up to The dependency versions are aligned across the manifest and lockfile, with no identified merge-blocking issue. Proceed after normal checks. Important Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (5 passed)
Full details: Security CheckExplanation The upgrade fixes the production Resolution Use an Full details: Engage In Review FeedbackExplanation The supplied review metadata reports zero actionable findings in the current review. It also states that this does not establish whether earlier review comments are absent or resolved. The reviewed diff changes only package.json and package-lock.json, and the repository provides no record of discussion or resolution states for prior comments. Therefore, the available evidence cannot show whether the user engaged with all review feedback.
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
d02642a to
b9f930e
Compare
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## alpha #10672 +/- ##
==========================================
+ Coverage 93.82% 93.83% +0.01%
==========================================
Files 192 192
Lines 16875 16875
Branches 252 252
==========================================
+ Hits 15833 15835 +2
+ Misses 1020 1018 -2
Partials 22 22 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
## [9.10.1-alpha.15](9.10.1-alpha.14...9.10.1-alpha.15) (2026-09-22) ### Bug Fixes * Bump express-rate-limit from 8.3.1 to 8.7.0 ([#10672](#10672)) ([73d8600](73d8600))
|
🎉 This change has been released in version 9.10.1-alpha.15 |
## [9.10.1](9.10.0...9.10.1) (2026-09-24) ### Bug Fixes * `Parse.Query.explain` runs afterFind trigger on query plan results ([#10536](#10536)) ([64d58ff](64d58ff)) * Account takeover via empty password in LDAP auth adapter ([GHSA-863r-39r9-vfcf](GHSA-863r-39r9-vfcf)) ([#10642](#10642)) ([f261957](f261957)) * Bump @parse/push-adapter from 8.4.0 to 8.5.3 ([#10676](#10676)) ([ae167c4](ae167c4)) * Bump body-parser from 2.2.2 to 2.3.0 ([#10600](#10600)) ([77e955f](77e955f)) * Bump express-rate-limit from 8.3.1 to 8.7.0 ([#10672](#10672)) ([73d8600](73d8600)) * Bump follow-redirects from 1.15.11 to 1.16.0 ([#10577](#10577)) ([d577327](d577327)) * Bump parse from 8.6.0 to 8.6.2, @parse/push-adapter from 8.5.3 to 8.5.5 and ws from 8.21.0 to 8.21.3 ([#10688](#10688)) ([11c8a40](11c8a40)) * Bump qs from 6.15.2 to 6.16.0 ([#10651](#10651)) ([25263e7](25263e7)) * Bump undici from 7.28.0 to 7.29.1 ([#10674](#10674)) ([2f09a30](2f09a30)) * Bump ws from 8.20.0 to 8.21.0 ([#10576](#10576)) ([629426f](629426f)) * Creating a session can delete another user's session ([#10582](#10582)) ([0df8779](0df8779)) * GraphQL argument and enum validation errors disclose target class names when public introspection is disabled ([GHSA-6m77-f8xr-f723](GHSA-6m77-f8xr-f723)) ([#10665](#10665)) ([fead3db](fead3db)) * GraphQL schema is disclosed by replaying an automatic persisted query when public introspection is disabled ([GHSA-gxxq-pghq-9vrc](GHSA-gxxq-pghq-9vrc)) ([#10669](#10669)) ([8d22053](8d22053)) * Install the latest Parse Server version in bootstrap.sh ([#10556](#10556)) ([997ee15](997ee15)) * LiveQuery discloses protected fields by resolving an incomplete subscriber identity ([GHSA-9jpp-xhh6-75mf](GHSA-9jpp-xhh6-75mf)) ([#10654](#10654)) ([66c507b](66c507b)) * Per-entry cache TTL is ignored by the in-memory cache adapter ([#10671](#10671)) ([1352c67](1352c67)) * Rate limit is bypassed by sending request header `X-Forwarded-For: 127.0.0.1` when Parse Server option `trustProxy` is permissive ([#10664](#10664)) ([ebd425e](ebd425e)) * Relation count query bypasses protectedFields for identity-scoped groups ([GHSA-rmhf-xv62-rm99](GHSA-rmhf-xv62-rm99)) ([#10667](#10667)) ([a32977f](a32977f)) * Server crash from unhandled promise rejection when multiple Cloud Code validator fields fail ([#10540](#10540)) ([90c2778](90c2778)) * Unauthenticated deletion of installation records via operator injection in device token deduplication ([GHSA-cc6h-c8m4-hgrx](GHSA-cc6h-c8m4-hgrx)) ([#10657](#10657)) ([ad00f82](ad00f82)) * Unverified auth provider identity accepted on password login for code-based auth adapters ([GHSA-mr43-w6c2-mvjq](GHSA-mr43-w6c2-mvjq)) ([#10662](#10662)) ([9b73e6f](9b73e6f))
|
🎉 This change has been released in version 9.10.1 |
Issue
express-rate-limitis pinned at8.3.1, which pinsip-addressto exactly10.1.0. That version ofip-addressis in the production dependency tree and is subject to two open Dependabot alerts onalpha:<= 10.3.010.3.1<= 10.1.010.1.1GHSA-mwp4-54f8-5fhris the material one:Address4decodes leading-zero octets as decimal while OS resolvers decode them as octal, which allows SSRF and trust-boundary bypass.ip-addressis reachable in production throughexpress-rate-limit's IP key generator.Because
express-rate-limit@8.3.1pins"ip-address": "10.1.0"exactly, the advisory cannot be resolved by a transitive bump — the ancestor has to move.Supersedes and closes #10621 (which targets
express-rate-limit8.6.2 /ip-address10.5.0) and #10661 (which targets 8.7.0 but is nowDIRTYagainstalpha).Closes #10621
Closes #10661
Approach
Bump
express-rate-limitfrom8.3.1to8.7.0(latest).express-rate-limit@8.7.0declares"ip-address": "^10.2.0", so a fresh install resolves the production copy to10.7.2, which carries no advisories. Manifest and lockfile only; no source changes.Upstream changes,
8.3.1->8.7.0No breaking changes — every release in the range is additive or a fix.
skipFailedRequestsfor requests closed very early.loggeroption; the default preserves the previousconsole.warn/console.errorbehaviour.initfunctions may now be async; rejections are caught and logged.ip-addressin response to GHSA-v2v4-37r5-5v8g.ipKeyGenerator.usedcount going negative whenskipSuccessfulRequests/skipFailedRequestsare set and the window resets mid-request; addedDAY/HOUR/MINUTE/SECONDconstants; added opt-in debug logging; validations now run once each rather than only on the first request.ipKeyGeneratordetects IPv4-mapped IPv6 addresses by range instead of by formatting.retryAfteroption.Parse Server constructs its limiter in
src/middlewares.jsand passeswindowMs,max,message,handler,skip,keyGeneratorandstore. None of those options changed semantics in this range, and no new option is required.Breaking Changes
None.
Code Changes Required
None — the upgrade is a drop-in replacement.
Notes for reviewers
Lockfile is version-only. No packages are added or removed (
0additions,0removals ofnode_modules/*entries); only versions and integrity hashes change. This branch is cut from currentalpha, so it does not carry the unrelatedgcp-metadatapruning that appeared in refactor: Bump express-rate-limit from 8.3.1 to 8.7.0 #10661's lockfile — that pruning already landed via refactor: Bump browserslist from 4.28.1 to 4.29.0 #10652.debugis not a new production dependency.express-rate-limit@8.6.0+declaresdebug: ^4.4.3, butdebug@4.4.3was already in the production tree onalpha, so the installed tree gains nothing.Debug logging is opt-in and worth knowing about. The logging added in 8.6.0 runs through the
express-rate-limitnamespace and is inert unlessDEBUG=express-rate-limitis set. If it is enabled,dist/index.cjslogsdebug("computed key %o", key)— and for thesessionrate limit zone Parse Server'skeyGeneratorreturnsrequest.info.sessionToken, so the raw session token would be written to stderr. This is not a regression introduced by this PR (no logging occurs by default), but operators should avoid enabling that namespace in production.Residual
ip-addresscopies are dev-only. After the upgrade the only production copy is10.7.2; the remaining10.1.0and9.0.5copies are vendored inside npm's own bundled tree undersemantic-release.Validation lifecycle changed, but the exposure surface did not. In
8.3.1,dist/index.cjs:939calledconfig.validations.disable()at the end of the first request, switching off every validation at once.8.7.0removes that and instead self-disables each check inside the wrapper (enabled[name] = false) after its own first run — upstream: "Validations are now run once each instead of only during the first request".The practical difference is limited to checks that did not happen to run during the first request: under
8.3.1those were silenced forever, whereas under8.7.0each still gets its one run whenever it is first reached.For the checks Parse Server can actually reach this is a no-op.
positiveHits,singleCountandlimitare invoked unconditionally on every request (rate-limit.ts, immediately after the store increment), so they already ran on request Why?? #1 under8.3.1beforedisable()was reached.singleCountis the one that would matter, because itsERR_ERL_DOUBLE_COUNTmessage embeds the raw key verbatim and is surfaced throughlogger.error(defaultconsole.error, noDEBUGrequired) — and for thesession/userzones Parse Server's key is a session token. But that was equally reachable on8.3.1; if anything8.3.1's window was marginally wider, since it had no per-check self-disable and concurrent early requests could each invoke it. Either way it can only fire on the first request(s) of a process, and none of the 62 specs inspec/RateLimit.spec.jstrigger it.The remaining per-request checks (
ip,trustProxy,xForwardedForHeader,forwardedHeader) live inside the defaultkeyGenerator, which Parse Server replaces, so they never run in either version.Store
initerrors are now caught instead of propagating.8.3.1calledconfig.store.init(options)bare, so a synchronous throw propagated out ofrateLimit()and therefore out ofaddRateLimit.8.7.0wraps it intry/catchand logs (upstream 8.5.0). Parse Server's Redis-backed rate limit store already handles its own connection errors, so this makes setup more resilient — but a genuinely broken store now fails quietly rather than loudly.Tasks
ip-addressalerts (GHSA-mwp4-54f8-5fhr, GHSA-v2v4-37r5-5v8g)