检查无效 UTF-8、转换单个小于号和出于安全考虑去除八位字节的原因

The reason to check for invalid UTF-8, convert single less than signs, and strips octets for security concerns

我正在搜索有关清理 Wordpress 上的用户输入文本区域字段的信息。

我找到了几个消毒功能,但功能之间存在一些差异。

我想知道其中一个消毒功能的功能,sanitize_text_field( string $str )

首先,我想知道原因 "Checks for invalid UTF-8" 为什么要清理无效的 UTF-8?

其次,我想推理将单个 < 字符转换为实体。

三、"Strips octets"

的原因

提前感谢您的帮助!

我不喜欢这个词"input sanitization"。输入清理是一个误导性术语,表示您可以在所有数据上挥舞魔杖并使其成为 "safe data"。问题是 "safe" 的定义在数据由不同的软件解释时会发生变化,编码要求也会发生变化。同样,"valid" 数据的概念因上下文而异 - 您的数据很可能需要特殊字符(',",&,<) - 请注意,SO 允许所有这些作为数据。

可以安全地嵌入到 SQL 查询中的输出可能不适合嵌入到 HTML 中。或者 Swift。或者 JSON。或者 shell 命令。或 CSV。并且剥离(或完全拒绝)值以使其可以安全地嵌入所有这些上下文(以及许多其他上下文)中的限制太多了。

那我们该怎么办呢?确保数据永远不会造成伤害。实现这一目标的最佳方法是首先避免对数据进行解释。参数化 SQL 查询就是一个很好的例子;参数永远不会被解释为 SQL,它们只是由数据库作为数据处理。

相同的数据可用于其他格式,例如 HTML。在这种情况下,数据应该在嵌入时针对该特定语言进行编码/转义。因此,为了防止 XSS,数据在被放入输出时应该被 HTML 转义(或 javascript 或 URL 转义)。不是在输入时。这同样适用于其他嵌入情况。

那么,我们是否应该让我们直接通过的任何东西都通过?

不 - 您肯定可以检查有关用户输入的内容,但这高度依赖于上下文。让我们称之为它是什么 - 验证。确保这是在服务器上完成的。一些例子:

  • 您通常应该验证任何字符串仅包含对其编码有效的字符(例如,没有无效的 UTF-8 序列)
  • 如果一个字段应该是一个整数,你当然可以验证这个字段以确保它包含一个整数(或者可能是 NULL)。
  • 您通常可以检查特定值是否是一组已知值中的一个(白名单验证)
  • 您可以要求大多数字段具有最小和最大长度。

为什么确保有效的 UTF-8 很重要?因为无效的 UTF-8 序列是绕过验证(尤其是黑名单验证)或将可见输入伪装成其他东西的好方法。技术堆栈的不同层通常对它们有不同的解释。有关此类攻击的更多详细信息,请参阅 Are there any security bugs with UTF-8?