experimental_taintUniqueValue
taintUniqueValue lets you prevent unique values from being passed to Client Components like passwords, keys, or tokens.
taintUniqueValue(errMessage, lifetime, value)To prevent passing an object containing sensitive data, see taintObjectReference.
Reference
taintUniqueValue(message, lifetime, value)
Call taintUniqueValue with a password, token, key or hash to register it with React as something that should not be allowed to be passed to the Client as is:
import {experimental_taintUniqueValue} from 'react';
experimental_taintUniqueValue(
'Do not pass secret keys to the client.',
process,
process.env.SECRET_KEY
);Parameters
-
message: The message you want to display ifvalueis passed to a Client Component. This message will be displayed as a part of the Error that will be thrown ifvalueis passed to a Client Component. -
lifetime: Any object that indicates how longvalueshould be tainted.valuewill be blocked from being sent to any Client Component while this object still exists. For example, passingglobalThisblocks the value for the lifetime of an app.lifetimeis typically an object whose properties containsvalue. -
value: A string, bigint or TypedArray.valuemust be a unique sequence of characters or bytes with high entropy such as a cryptographic token, private key, hash, or a long password.valuewill be blocked from being sent to any Client Component.
Returns
experimental_taintUniqueValue returns undefined.
Caveats
- Deriving new values from tainted values can compromise tainting protection. New values created by uppercasing tainted values, concatenating tainted string values into a larger string, converting tainted values to base64, substringing tainted values, and other similar transformations are not tainted unless you explicitly call
taintUniqueValueon these newly created values. - Do not use
taintUniqueValueto protect low-entropy values such as PIN codes or phone numbers. If any value in a request is controlled by an attacker, they could infer which value is tainted by enumerating all possible values of the secret.
Usage
Prevent a token from being passed to Client Components
To ensure that sensitive information such as passwords, session tokens, or other unique values do not inadvertently get passed to Client Components, the taintUniqueValue function provides a layer of protection. When a value is tainted, any attempt to pass it to a Client Component will result in an error.
The lifetime argument defines the duration for which the value remains tainted. For values that should remain tainted indefinitely, objects like globalThis or process can serve as the lifetime argument. These objects have a lifespan that spans the entire duration of your app’s execution.
import {experimental_taintUniqueValue} from 'react';
experimental_taintUniqueValue(
'Do not pass a user password to the client.',
globalThis,
process.env.SECRET_KEY
);If the tainted value’s lifespan is tied to a object, the lifetime should be the object that encapsulates the value. This ensures the tainted value remains protected for the lifetime of the encapsulating object.
import {experimental_taintUniqueValue} from 'react';
export async function getUser(id) {