Ce qui se passe
Payload publie v3.90.0 le 18 septembre 2026 avec un avertissement en tête : la version contient « un ensemble de correctifs de sécurité critiques », et l'équipe recommande de mettre à jour même si aucun des points listés ne vous concerne.
Les notes ne disent rien de l'exploitation ni de la gravité : c'est voulu. Les identifiants CVE et GHSA seront publiés séparément. Ce qui est documenté, c'est l'effet de la mise à jour sur un projet existant, point par point, avec pour chacun « concerné si » et « action requise ».
Ce qu'il faut faire après la mise à jour
Un champ resetPasswordRequestedAt apparaît sur les collections
d'utilisateurs : la réinitialisation de mot de passe lève désormais le
verrouillage du compte, et la demande de mot de passe oublié est limitée en
fréquence. Sur une base relationnelle, il faut donc une migration :
pnpm payload generate:types
pnpm payload migrate:create add-reset-password-requested-at
pnpm payload migrateLes publications et dépublications programmées en attente au moment de la
mise à jour sont à recréer. Le code qui met des jobs schedulePublish en file
à la main doit passer user: { relationTo, value }.
Les changements de comportement
- SVG, XHTML et XML : validation plus stricte à l'upload.
allowRestrictedFileTypes: truedans la propriétéuploadde la collection rétablit l'ancien comportement, si vous en avez vraiment besoin. - Uploads côté client (
clientUploads: true) durcis sur tous les adaptateurs. Sur GCS, ajoutez l'en-têtex-goog-if-generation-matchaux en-têtes autorisés du CORS. - Azure : avec
allowContainerCreate: true, les conteneurs sont créés privés.containerAccess: 'blob'pour garder l'ancien réglage. - Récupération sortante :
disableAccessControlne désactive plus la protection des requêtes sortantes. Il faut une listeupload.skipSafeFetchrestreinte aux destinations de confiance. - Fichiers externes : il faut une origine de confiance (
serverURL, ou l'origine exacte dans la configuration CORS ou CSRF), et les URL non HTTP(S) sont refusées.externalFileHeaderFilterreçoit un contexte optionnel :
upload: {
externalFileHeaderFilter: (headers, context) => {
if (!context?.isSameOrigin) {
delete headers.cookie
delete headers.authorization
}
return headers
},
}- Multipart plafonné à 50 Mo par défaut. À relever par
requestSizeLimitsi vos envois dépassent cette taille. - Clés d'API : plus relisibles après leur génération, ni dans l'interface ni
dans les opérations Payload.
useAPIKey: { reveal: true }rétablit l'ancien comportement. - Form Builder : la lecture des soumissions revient par défaut à la collection d'administration quand plusieurs collections d'authentification existent.
- Jointures polymorphes : un filtre non supporté lève une
QueryError— champs localisés, champs dans un tableau ou un bloc, chemins qui traversent une relation ou un JSON (owner.email), opérateursnear,within,intersectsetall. Les règles d'accès en lecture et lesbaseFilterdes collections avec dossiers sont concernés.
La version embarque aussi une nouvelle version de Lexical : sans effet sur
les fonctionnalités intégrées, mais une fonctionnalité d'éditeur maison doit
être recompilée et testée. Les dépendances lexical ou @lexical/* installées
à la main sont à retirer au profit des réexports de
@payloadcms/richtext-lexical/lexical.
Source : Release v3.90.0, payloadcms/payload sur GitHub, 18 septembre 2026.