experimental_taintObjectReference¶
В разработке
Этот API является экспериментальным и пока не доступен в стабильной версии React.
Вы можете попробовать его, обновив пакеты React до последней экспериментальной версии:
react@experimental
react-dom@experimental
eslint-plugin-react-hooks@experimental
.
Экспериментальные версии React могут содержать ошибки. Не используйте их в продакшене.
Этот API доступен только в компонентах React Server.
Функция taintObjectReference
позволяет предотвратить передачу определенного экземпляра объекта клиентскому компоненту, например, объекта user
.
1 |
|
Чтобы не передавать ключ, хэш или токен, смотрите taintUniqueValue
.
Описание¶
taintObjectReference(message, object)
¶
Вызовите taintObjectReference
с объектом, чтобы зарегистрировать его в React как нечто, что не должно быть передано клиенту как есть:
1 2 3 4 5 6 |
|
Параметры
-
message
: Сообщение, которое вы хотите отобразить, если объект будет передан клиентскому компоненту. Это сообщение будет отображено как часть ошибки, которая будет выброшена, если объект будет передан клиентскому компоненту. -
object
: Объект, который будет запятнан. Функции и экземпляры классов могут быть переданы вtaintObjectReference
какobject
. Функции и классы уже заблокированы от передачи клиентским компонентам, но стандартное сообщение об ошибке React будет заменено на то, которое вы определили вmessage
. Когда конкретный экземпляр типизированного массива передается вtaintObjectReference
какobject
, все остальные экземпляры типизированного массива не будут затронуты.
Возвращает
experimental_taintObjectReference
возвращает undefined
.
Замечания
- При воссоздании или клонировании запятнанного объекта создается новый незапятнанный объект, который может содержать конфиденциальные данные. Например, если у вас есть запятнанный объект
user
,const userInfo = {name: user.name, ssn: user.ssn}
или{...user}
создаст новые объекты, которые не будут запятнаны.taintObjectReference
защищает только от простых ошибок, когда объект передается клиентскому компоненту без изменений.
Не полагайтесь на то, что безопасность обеспечивается только путем запятнания
Запятнание объекта не предотвращает утечку всех возможных производных значений. Например, клон запятнанного объекта создаст новый незапятнанный объект. Использование данных из запятнанного объекта (например, {secret: taintedObj.secret}
) приведет к созданию нового значения или объекта, который не является запятнанным. Запятнанность - это уровень защиты; безопасное приложение будет иметь несколько уровней защиты, хорошо продуманные API и шаблоны изоляции.
Использование¶
Предотвращение непреднамеренного попадания пользовательских данных к клиенту¶
Клиентский компонент никогда не должен принимать объекты, содержащие конфиденциальные данные. В идеале, функции получения данных не должны открывать данные, к которым текущий пользователь не должен иметь доступа. Иногда во время рефакторинга случаются ошибки. Чтобы защититься от таких ошибок в дальнейшем, мы можем "запятнать" объект пользователя в нашем API данных.
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Теперь, когда кто-то попытается передать этот объект клиентскому компоненту, вместо него будет выдана ошибка с переданным сообщением об ошибке.
Защита от утечек при получении данных¶
Если вы используете среду Server Components, которая имеет доступ к конфиденциальным данным, вам нужно быть осторожным, чтобы не передавать объекты напрямую:
1 2 3 4 5 |
|
1 2 3 4 5 6 7 8 |
|
1 2 3 4 5 6 |
|
В идеале функция getUser
не должна раскрывать данные, к которым текущий пользователь не должен иметь доступа. Чтобы предотвратить передачу объекта user
клиентскому компоненту в дальнейшем, мы можем "испортить" объект пользователя:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Теперь, если кто-то попытается передать объект user
клиентскому компоненту, будет выдана ошибка с переданным сообщением об ошибке.
Источник — https://react.dev/reference/react/experimental_taintObjectReference