diff --git a/src/content/reference/react/experimental_taintObjectReference.md b/src/content/reference/react/experimental_taintObjectReference.md index c7b4e15b0c..35bccc3846 100644 --- a/src/content/reference/react/experimental_taintObjectReference.md +++ b/src/content/reference/react/experimental_taintObjectReference.md @@ -56,7 +56,7 @@ experimental_taintObjectReference( * `message`:对象被传递给客户端组件时显示的消息。如果对象被传递给客户端组件,此消息将作为错误的一部分显示。 -* `object`:要标记的对象。函数和类实例可以作为 `object` 传递给 `taintObjectReference`。React 会阻止直接将函数和类传递给客户端组件,并把默认的错误消息替换为在 `message` 中定义的内容。当将特定类型数组的实例作为 `object` 传递给 `taintObjectReference` 时,该类型数组的其他副本将不会被标记。 +* `object`:被污染的对象。函数和类实例可以作为 `object` 传递给 `taintObjectReference`。React 会阻止直接将函数和类传递给客户端组件,并把默认的错误消息替换为在 `message` 中定义的内容。当将特定类型数组的实例作为 `object` 传递给 `taintObjectReference` 时,该类型数组的其他副本将不会被污染。 #### 返回值 {/*returns*/} @@ -64,11 +64,11 @@ experimental_taintObjectReference( #### 注意 {/*caveats*/} -- 重新创建或克隆一个被标记的对象会创建一个新的未标记的对象,其中可能包含敏感数据。如果有一个被标记的 `user` 对象,执行 `const userInfo = {name: user.name, ssn: user.ssn}` 或 `{...user}` 将创建新的未标记对象。`taintObjectReference` 只能防止把未修改的对象传递给客户端组件这种简单的错误。 +- 重新创建或克隆一个被污染的对象会创建一个新的未被污染的对象,其中可能包含敏感数据。如果有一个被污染的 `user` 对象,执行 `const userInfo = {name: user.name, ssn: user.ssn}` 或 `{...user}` 将创建新的未被污染的对象。`taintObjectReference` 只能防止把未修改的对象传递给客户端组件这种简单的错误。 -**不要仅依赖于标记来确保安全**。标记对象并不防止泄露每一个可能的派生值。例如,被标记对象的克隆将创建一个新的未标记对象。使用来自被标记对象的数据(例如 `{secret: taintedObj.secret}`)将创建一个新的值或对象,它不被标记。标记只是一层保护,安全的应用程序应该有多层保护、精心设计的 API 和隔离模式。 +**不要仅依赖于污点标记来确保安全**。被污染的对象并不防止泄露每一个可能的派生值。例如,被污染的对象的克隆将创建一个新的未被污染的对象。使用来自被污染的对象的数据(例如 `{secret: taintedObj.secret}`)将创建一个新的值或对象,它不被污染。污点标记只是一层保护,安全的应用程序应该有多层保护、精心设计的 API 和隔离模式。 @@ -78,7 +78,7 @@ experimental_taintObjectReference( ### 防止用户数据被无意间传递到客户端 {/*prevent-user-data-from-unintentionally-reaching-the-client*/} -客户端组件不应接受携带敏感数据的对象。理想情况下数据获取函数不应暴露当前用户不允许访问的数据。有时在重构过程中会发生错误。为了防止这些错误在以后发生,我们可以在数据 API 中“标记”用户对象。 +客户端组件不应接受携带敏感数据的对象。理想情况下数据获取函数不应暴露当前用户不允许访问的数据。有时在重构过程中会发生错误。为了防止这些错误在以后发生,我们可以在数据 API 中“污染”用户对象。 ```js import {experimental_taintObjectReference} from 'react'; @@ -130,7 +130,7 @@ export async function InfoCard({ user }) { } ``` -理想情况下 `getUser` 不应暴露当前用户不允许访问的数据。为了防止将来把 `user` 对象传递给客户端组件,我们可以对用户对象进行“标记”: +理想情况下 `getUser` 不应暴露当前用户不允许访问的数据。为了防止将来把 `user` 对象传递给客户端组件,我们可以对用户对象进行“污染”: ```js diff --git a/src/content/reference/react/experimental_taintUniqueValue.md b/src/content/reference/react/experimental_taintUniqueValue.md index 9cf7db206a..03c0df6c80 100644 --- a/src/content/reference/react/experimental_taintUniqueValue.md +++ b/src/content/reference/react/experimental_taintUniqueValue.md @@ -57,7 +57,7 @@ experimental_taintUniqueValue( * `message`:`value` 被传递给客户端组件时显示的消息。如果将 `value` 传递给客户端组件,此消息将作为错误的一部分显示。 -* `lifetime`:指示 `value` 应该被标记多长时间的任何对象。只要此对象仍然存在,将阻止把 `value` 发送到任何客户端组件。例如,传递 `globalThis` 将在应用程序的生命周期内阻止该值的传递。`lifetime` 通常是一个包含 `value` 属性的对象。 +* `lifetime`:指示 `value` 应该被污染多长时间的任何对象。只要此对象仍然存在,将阻止把 `value` 发送到任何客户端组件。例如,传递 `globalThis` 将在应用程序的生命周期内阻止该值的传递。`lifetime` 通常是一个包含 `value` 属性的对象。 * `value`:字符串、bigint 或 TypedArray。`value` 必须是具有高熵的字符或字节的唯一序列,例如加密令牌、私钥、哈希值或长密码。`value` 将被阻止发送到任何客户端组件。 @@ -67,8 +67,8 @@ experimental_taintUniqueValue( #### 注意 {/*caveats*/} -* 从受标记的值派生新值可能会破坏标记保护。通过将受标记的值大写、将受标记的字符串值连接成较大的字符串、将受标记的值转换为 base64、对受标记的值进行子字符串操作以及其他类似的转换来创建的新值,除非明确调用 `taintUniqueValue` 标记这些新创建的值,否则它们不会受到标记。 -* Do not use `taintUniqueValue` to 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. +* 从被污染的值派生新值可能会破坏污点标记保护。通过将被污染的值大写、将被污染的字符串值连接成较大的字符串、将被污染的值转换为 base64、对被污染的值进行子字符串操作以及其他类似的转换来创建的新值,除非明确调用 `taintUniqueValue` 污染这些新创建的值,否则它们不会被污染。 +* 不要使用 `taintUniqueValue` 保护诸如 PIN 码与电话号码这类低熵值。如果请求中的任何值都可以受攻击者控制,那么他们可以秘密枚举所有值来判断那个值是被污染的。 --- @@ -76,9 +76,9 @@ experimental_taintUniqueValue( ### 防止将令牌传递给客户端组件 {/*prevent-a-token-from-being-passed-to-client-components*/} -为了确保敏感信息(如密码、会话令牌或其他唯一值)不会被意外地传递给客户端组件,`taintUniqueValue` 函数提供了一层保护。当一个值被标记时,任何尝试将其传递给客户端组件的操作都将导致错误。 +为了确保敏感信息(如密码、会话令牌或其他唯一值)不会被意外地传递给客户端组件,`taintUniqueValue` 函数提供了一层保护。当一个值被污染时,任何尝试将其传递给客户端组件的操作都将导致错误。 -`lifetime` 参数定义了值保持受标记状态的持续时间。对于应该永久保持受标记状态的值,可以使用像 [`globalThis`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/globalThis) 或 `process` 这样的对象作为 `lifetime` 参数。这些对象的生命周期跨越应用程序执行的整个持续时间。 +`lifetime` 参数定义了值保持被污染的状态的持续时间。对于应该永久保持被污染的状态的值,可以使用像 [`globalThis`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/globalThis) 或 `process` 这样的对象作为 `lifetime` 参数。这些对象的生命周期跨越应用程序执行的整个持续时间。 ```js import {experimental_taintUniqueValue} from 'react'; @@ -90,7 +90,7 @@ experimental_taintUniqueValue( ); ``` -如果受标记值的寿命与某个对象相关联,那么 `lifetime` 应该是封装该值的对象。这样可以确保受标记值在封装对象的生命周期内保持受保护状态。 +如果被污染的值的寿命与某个对象相关联,那么 `lifetime` 应该是封装该值的对象。这样可以确保被污染的值在封装对象的生命周期内保持受保护状态。 ```js import {experimental_taintUniqueValue} from 'react'; @@ -106,11 +106,11 @@ export async function getUser(id) { } ``` -在此示例中,`user` 对象用作 `lifetime` 参数。如果此对象存储在全局缓存中或可以被其他请求访问,会话令牌将保持受标记状态。 +在此示例中,`user` 对象用作 `lifetime` 参数。如果此对象存储在全局缓存中或可以被其他请求访问,会话令牌将保持被污染的状态。 -**不要仅依赖于标记来确保安全**。对一个值进行标记不会阻止每一个可能派生出的值。例如,通过将受标记的字符串大写来创建新值,将不会标记新值。 +**不要仅依赖于污点标记来确保安全**。污染一个值不会阻止每一个可能派生出的值。例如,通过将被污染的字符串大写来创建新值,将不会污染新值。 ```js @@ -124,14 +124,14 @@ experimental_taintUniqueValue( password ); -const uppercasePassword = password.toUpperCase() // `uppercasePassword` 不受标记 +const uppercasePassword = password.toUpperCase() // `uppercasePassword` 不被污染 ``` -在此示例中,常量 `password` 受到标记。然后,通过在 `password` 上调用 `toUpperCase` 方法使用 `password` 创建新值 `uppercasePassword`。新创建的 `uppercasePassword` 不受标记。 +在此示例中,常量 `password` 被污染。然后,通过在 `password` 上调用 `toUpperCase` 方法使用 `password` 创建新值 `uppercasePassword`。新创建的 `uppercasePassword` 不被污染。 -从受标记值派生新值的其他类似方式,如将其连接到较大的字符串中、将其转换为 base64 或返回子字符串,会创建未受标记的值。 +从被污染的值派生新值的其他类似方式,如将其连接到较大的字符串中、将其转换为 base64 或返回子字符串,会创建未被污染的值。 -标记仅保护免受简单错误的影响,比如明确将机密值传递给客户端的错误。在调用 `taintUniqueValue` 时出现的错误,例如在 React 外部使用全局存储,没有相应的生命周期对象,可能会导致受标记的值变为未受标记。标记是一层保护,安全的应用程序将具有多层保护、精心设计的 API 和隔离模式。 +污点标记仅保护免受简单错误的影响,比如明确将机密值传递给客户端的错误。在调用 `taintUniqueValue` 时出现的错误,例如在 React 外部使用全局存储,没有相应的生命周期对象,可能会导致被污染的值变为未被污染。污点标记是一层保护,安全的应用程序将具有多层保护、精心设计的 API 和隔离模式。 @@ -166,7 +166,7 @@ export async function Overview({ password }) { [comment]: <> (TODO: 一旦 `server-only` 文档写好就就将其链接到对应处) -理想情况下,像这样的机密信息应该被抽象到一个单独的辅助文件中,只有服务器上的可信数据工具才能导入它。这个辅助文件甚至可以被标记为 [`server-only`](https://www.npmjs.com/package/server-only),以确保此文件不会在客户端被导入。 +理想情况下,像这样的机密信息应该被抽象到一个单独的辅助文件中,只有服务器上的可信数据工具才能导入它。这个辅助文件甚至可以被污染为 [`server-only`](https://www.npmjs.com/package/server-only),以确保此文件不会在客户端被导入。 ```js import "server-only"; @@ -178,7 +178,7 @@ export function fetchAPI(url) { ``` 有时,在重构过程中可能会发生错误,而且不是所有同事都可能知道这一点。 -为了防止此类错误在后续发生,我们可以对实际密码进行“标记”: +为了防止此类错误在后续发生,我们可以对实际密码进行“污染”: ```js import "server-only";