β οΈ This release contains a set of critical security fixes. Please review the following notes and upgrade as soon as possible. Even if none of the listed items below affect you, we still recommend updating as soon as possible.
These notes only cover the behavior, configuration, and API-surface changes that projects may need to react to when upgrading. Exploit details, attack surface descriptions, and severity are intentionally omitted.
CVE and GHSA identifiers for the underlying issues are published separately.
Every entry has: Affected if you (concrete conditions - if none apply, no action is required), and Action required.
After upgrading:
pnpm payload generate:typespnpm payload migrate:create <migration-name>
pnpm payload migrate
Adds new resetPasswordRequestedAt field to user collections
Action required:
pnpm payload generate:typespnpm payload migrate:create add-reset-password-requested-at
pnpm payload migrate
Affected if you:
schedulePublish jobs directly or depend on its generated task types.Action required:
user: { relationTo, value } (value is user ID).Affected if you:
Action required:
allowRestrictedFileTypes: true in the collections upload property if the previous behavior is explicitly required.Affected if you:
clientUploads: true (S3, GCS, Azure, or custom).Action required:
x-goog-if-generation-match header to GCS CORS allowed headers.Affected if you:
@payloadcms/storage-azure adapter with allowContainerCreate: trueAction required:
containerAccess: 'blob' in your Azure storage config.disablePayloadAccessControl no longer disables safe outbound fetchAffected if you:
disableAccessControl: true in your Payload config.Action required:
upload.skipSafeFetch allowlist for trusted destinationsskipSafeFetch: true only when every URL accepted by the collection is trusted.Affected if you:
upload.disableLocalStorage: true and rely on Payload fetching relative URLs whose endpoint requires a Payload session cookie.externalFileHeaderFilter, particularly if it assumes it runs only once.Action required:
serverURL or add the exact application origin to your CORS or CSRF configuration.externalFileHeaderFilter and use the optional context when headers need to vary by destination.upload: {
externalFileHeaderFilter: (headers, context) => {
+ if (!context?.isSameOrigin) {
+ delete headers.cookie
+ delete headers.authorization
+ }
+
return headers
},
}
Affected if you:
Action required:
Affected if you:
Action required:
requestSizeLimit in your Payload config:upload {
+ requestSizeLimit: 75 * 1024 * 1024, // Example 75 MiB for the complete multipart request
}
Affected if you:
Action required:
where validation for polymorphic joinsPolymorphic joins now apply complete where constraints and throw a QueryError when a filter is unsupported.
Unsupported filters include:
owner.email.near, within, intersects, and all operators.Affected if you:
collection references multiple collections, andwhere constraint.baseFilter or baseListFilter used by folder browsing.Action required:
where constraints and read access rules for every collection referenced by a polymorphic join.If you wish to retain old behavior, set the following in your config:
auth: {
- useAPIKey: true,
+ useAPIKey: {
+ reveal: true,
+ },
}
No application changes or data migration are needed when using Payload's built-in rich text features.
If you maintain custom rich text features, check that they still compile and that custom content loads, copies, and pastes correctly. Lexical removed some older APIs, tightened TypeScript types, and changed how custom nodes are loaded and copied. Tests that inspect the editor's HTML may also need updated selectors or snapshots because Lexical adds some internal markup.
Do not install lexical or @lexical/* yourself for use with Payload. Remove any direct dependencies you added for the editor and use Payload's re-exports from @payloadcms/richtext-lexical/lexical and @payloadcms/richtext-lexical/lexical/*. Payload supplies the matching versions; mixing versions can break the editor. This is the existing custom feature requirement.
improve access defaults for jobs (#17867) (4379bf0)
This backports the v4 jobs access changes to Payload v3.