experimental_taintObjectReference
taintObjectReference
vous permet dâempĂȘcher quâune instance objet prĂ©cise soit passĂ©e Ă un Composant Client, comme par exemple un objet user
.
experimental_taintObjectReference(message, object);
Pour empĂȘcher le passage dâune clĂ©, dâun hash ou dâun jeton, utilisez taintUniqueValue
.
Référence
taintObjectReference(message, object)
Appelez taintObjectReference
avec un objet pour indiquer Ă React quâil ne doit pas permettre le passage de cet objet tel quel vers le cĂŽtĂ© client :
import { experimental_taintObjectReference } from 'react';
experimental_taintObjectReference(
'Ne passez pas TOUTES les variables dâenvironnement au client.',
process.env
);
Voir plus dâexemples ci-dessous.
ParamĂštres
-
message
: le message que vous souhaitez afficher si lâobjet est passĂ© Ă un Composant Client. Ce message fera partie de lâerreur qui sera levĂ©e si lâobjet est passĂ© Ă un Composant Client. -
object
: lâobjet a « ternir ». Les fonctions et instances de classes peuvent ĂȘtre passĂ©es en tant quâobject
ĂtaintObjectReference
. React empĂȘche dâentrĂ©e de jeu leur passage aux Composants Clients, mais ça remplacera le message dâerreur par dĂ©faut avec ce que vous aurez passĂ© commemessage
. Notez que lorsquâune instance prĂ©cise dâun tableau typĂ© (Typed Array, NdT) est passĂ©e commeobject
ĂtaintObjectReference
, les copies de ce tableau typé ne seront quant à elles pas ternies.
Valeur renvoyée
experimental_taintObjectReference
renvoie undefined
.
Limitations
- Recréer ou cloner un objet terni produit un nouvel objet intact, susceptible de contenir des données sensibles. Si par exemple vous avez un objet
user
terni,const userInfo = {name: user.name, ssn: user.ssn}
ou{...user}
produiront de nouveaux objets qui ne seront, eux, pas ternis.taintObjectReference
ne protĂšge que contre les bĂ©vues simples lorsque lâobjet est passĂ© tel quel Ă un Composant Client.
Utilisation
EmpĂȘcher des donnĂ©es utilisateur dâatteindre le client par inadvertance
Un Composant Client ne devrait jamais accepter des objets comportant des donnĂ©es sensibles. Dans lâidĂ©al, les fonctions de chargement de donnĂ©es ne devraient pas exposer des donnĂ©es auxquelles lâutilisateur actif nâa pas accĂšs. Mais des erreurs peuvent survenir lors dâune refonte du code. Pour se protĂ©ger contre des erreurs en aval nous pouvons « ternir » lâobjet utilisateur dans notre API de donnĂ©es.
import { experimental_taintObjectReference } from 'react';
export async function getUser(id) {
const user = await db`SELECT * FROM users WHERE id = ${id}`;
experimental_taintObjectReference(
'Ne passez pas lâobjet utilisateur entier au client. ' +
'Récupérez plutÎt les propriétés spécifiques à votre scénario.',
user,
);
return user;
}
DĂ©sormais, si un code serveur quelconque essaie de passer cet objet Ă un Composant Client, une erreur sera levĂ©e avec le message dâerreur fourni.
En détail
Si votre environnement de Composants Serveur a accĂšs Ă des donnĂ©es sensibles, vous devez ĂȘtre attentif·ve Ă ne pas passer des objets directement :
// api.js
export async function getUser(id) {
const user = await db`SELECT * FROM users WHERE id = ${id}`;
return user;
}
import { getUser } from 'api.js';
import { InfoCard } from 'components.js';
export async function Profile(props) {
const user = await getUser(props.userId);
// NE FAITES PAS ĂA
return <InfoCard user={user} />;
}
// components.js
"use client";
export async function InfoCard({ user }) {
return <div>{user.name}</div>;
}
Dans lâidĂ©al, getUser
ne devait pas exposer de donnĂ©es auxquelles lâutilisateur courant nâa pas accĂšs. Pour empĂȘcher le passage en aval de lâobjet user
à un Composant Client, nous pouvons décider de « ternir » cet objet :
// api.js
import { experimental_taintObjectReference } from 'react';
export async function getUser(id) {
const user = await db`SELECT * FROM users WHERE id = ${id}`;
experimental_taintObjectReference(
'Ne passez pas lâobjet utilisateur entier au client. ' +
'Récupérez plutÎt les propriétés spécifiques à votre scénario.',
user,
);
return user;
}
DĂ©sormais, si un code serveur quelconque essaie de passer cet objet Ă un Composant Client, une erreur sera levĂ©e avec le message dâerreur fourni.