experimental_taintUniqueValue
Passwords, keys, அல்லது tokens போன்ற unique values Client Components-க்கு pass செய்யப்படுவதைத் தடுக்க taintUniqueValue உதவுகிறது.
taintUniqueValue(errMessage, lifetime, value)Sensitive data கொண்ட object pass செய்யப்படுவதைத் தடுக்க, taintObjectReference-ஐப் பார்க்கவும்.
குறிப்பு
taintUniqueValue(message, lifetime, value)
Password, token, key, அல்லது hash Client-க்கு அப்படியே pass செய்ய அனுமதிக்கப்படக்கூடாத ஒன்று என்று React-இல் register செய்ய, அந்த value உடன் taintUniqueValue-ஐ call செய்யுங்கள்:
import {experimental_taintUniqueValue} from 'react';
experimental_taintUniqueValue(
'Do not pass secret keys to the client.',
process,
process.env.SECRET_KEY
);மேலும் உதாரணங்களை கீழே பார்க்கவும்.
Parameters
-
message:valueClient Component-க்கு pass செய்யப்பட்டால் காட்ட வேண்டிய message.valueClient Component-க்கு pass செய்யப்பட்டால் throw ஆகும் Error-ன் ஒரு பகுதியாக இந்த message காட்டப்படும். -
lifetime:valueஎவ்வளவு நேரம் tainted ஆக இருக்க வேண்டும் என்பதை காட்டும் எந்த object-வும். இந்த object இன்னும் இருக்கும் வரை,valueஎந்த Client Component-க்கும் அனுப்பப்படுவது தடுக்கப்படும். உதாரணமாக,globalThispass செய்தால் app-ன் lifetime முழுவதும் value block செய்யப்படும். பொதுவாகlifetimeஎன்பதுvalue-ஐ properties-ல் கொண்டிருக்கும் object ஆகும். -
value: ஒரு string, bigint, அல்லது TypedArray.valuecryptographic token, private key, hash, அல்லது நீண்ட password போன்ற high entropy கொண்ட characters அல்லது bytes-ன் unique sequence ஆக இருக்க வேண்டும்.valueஎந்த Client Component-க்கும் அனுப்பப்படுவது தடுக்கப்படும்.
Returns
experimental_taintUniqueValue undefined return செய்கிறது.
Caveats
- Tainted values-இலிருந்து புதிய values derive செய்வது tainting protection-ஐ பலவீனப்படுத்தலாம். Tainted values-ஐ uppercase செய்வது, tainted string values-ஐ பெரிய string-களில் concatenate செய்வது, tainted values-ஐ base64-க்கு convert செய்வது, tainted values-இன் substring எடுப்பது, மற்றும் இதுபோன்ற transformations மூலம் உருவாகும் புதிய values tainted அல்ல; அவற்றின் மீது explicit-ஆக
taintUniqueValuecall செய்தால் மட்டுமே tainted ஆகும். - PIN codes அல்லது phone numbers போன்ற low-entropy values-ஐப் பாதுகாக்க
taintUniqueValueபயன்படுத்த வேண்டாம். ஒரு request-இல் உள்ள எந்த value-யும் attacker-னால் கட்டுப்படுத்தப்பட்டால், secret-ன் அனைத்து சாத்தியமான values-ஐ enumerate செய்து எந்த value tainted என்பதை infer செய்ய முடியும்.
பயன்பாடு
Token Client Components-க்கு pass செய்யப்படுவதைத் தடுக்கவும்
Passwords, session tokens, அல்லது பிற unique values போன்ற sensitive information தவறுதலாக Client Components-க்கு pass செய்யப்படாததை உறுதிசெய்ய, taintUniqueValue function ஒரு பாதுகாப்பு layer வழங்குகிறது. ஒரு value tainted ஆனால், அதை Client Component-க்கு pass செய்யும் எந்த முயற்சியும் error-ஆக முடியும்.
lifetime argument, value எவ்வளவு காலம் tainted ஆக இருக்கும் என்பதை வரையறுக்கிறது. காலவரையின்றி tainted ஆக இருக்க வேண்டிய values-க்கு, globalThis அல்லது process போன்ற objects lifetime argument ஆக பயன்படலாம். இந்த objects உங்கள் app execution முழு காலத்திற்கும் இருக்கும் lifespan கொண்டவை.
import {experimental_taintUniqueValue} from 'react';
experimental_taintUniqueValue(
'Do not pass a user password to the client.',
globalThis,
process.env.SECRET_KEY
);Tainted value-ன் lifespan ஒரு object-இன் lifespan-ஐ சார்ந்திருந்தால், lifetime அந்த value-ஐ encapsulate செய்யும் object ஆக இருக்க வேண்டும். இதனால் encapsulating object-ன் lifetime முழுவதும் tainted value பாதுகாக்கப்பட்டிருப்பது உறுதியாகும்.
import {experimental_taintUniqueValue} from 'react';
export async function getUser(id) {
const user = await db`SELECT * FROM users WHERE id = ${id}`;
experimental_taintUniqueValue(
'Do not pass a user session token to the client.',
user,
user.session.token
);
return user;
}இந்த உதாரணத்தில், user object lifetime argument ஆக செயல்படுகிறது. இந்த object global cache-இல் store செய்யப்பட்டாலோ அல்லது மற்றொரு request மூலம் access செய்யக்கூடியதாக இருந்தாலோ, session token தொடர்ந்து tainted ஆக இருக்கும்.
Deep Dive
Database passwords போன்ற private keys அல்லது passwords-க்கு access உள்ள Server Components environment-ஐ நீங்கள் run செய்தால், அவற்றை Client Component-க்கு pass செய்யாமல் கவனமாக இருக்க வேண்டும்.
export async function Dashboard(props) {
// DO NOT DO THIS
return <Overview password={process.env.API_PASSWORD} />;
}"use client";
import {useEffect} from '...'
export async function Overview({ password }) {
useEffect(() => {
const headers = { Authorization: password };
fetch(url, { headers }).then(...);
}, [password]);
...
}இந்த உதாரணம் secret API token-ஐ client-க்கு leak செய்யும். குறிப்பிட்ட user-க்கு access இருக்கக்கூடாத data-வை access செய்ய இந்த API token பயன்படுத்த முடிந்தால், அது data breach-க்கு வழிவகுக்கலாம்.
சிறந்த முறையில், இப்படிப்பட்ட secrets server-இல் உள்ள trusted data utilities மட்டுமே import செய்யக்கூடிய ஒரு helper file-க்கு abstract செய்யப்பட வேண்டும். இந்த file client-இல் import செய்யப்படாமல் இருப்பதை உறுதிசெய்ய helper-ஐ server-only கொண்டு tag செய்யலாம்.
import "server-only";
export function fetchAPI(url) {
const headers = { Authorization: process.env.API_PASSWORD };
return fetch(url, { headers });
}சில நேரங்களில் refactoring-இல் தவறுகள் நடக்கலாம்; உங்கள் colleagues எல்லோரும் இதைப் பற்றி அறிந்திருக்க வேண்டிய அவசியமில்லை. பின்னர் இப்படியான தவறுகள் நடப்பதிலிருந்து பாதுகாக்க, actual password-ஐ “taint” செய்யலாம்:
import "server-only";
import {experimental_taintUniqueValue} from 'react';
experimental_taintUniqueValue(
'Do not pass the API token password to the client. ' +
'Instead do all fetches on the server.'
process,
process.env.API_PASSWORD
);இப்போது யாராவது இந்த password-ஐ Client Component-க்கு pass செய்யவோ, அல்லது Server Function மூலம் password-ஐ Client Component-க்கு அனுப்பவோ முயன்றால், நீங்கள் taintUniqueValue call செய்தபோது வரையறுத்த message உடன் ஒரு error throw ஆகும்.