提问人:hiyo 提问时间:5/2/2020 更新时间:5/3/2020 访问量:155
检查无效的 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(字符串$str)
首先,我想知道“检查无效的 UTF-8”的原因 为什么要清理无效的 UTF-8?
其次,我想推理将单个<字符转换为实体。
三、“条带八位组”的原因
提前感谢您的帮助!
答:
我不喜欢“输入清理”这个词。输入清理是一个误导性术语,表示您可以对所有数据挥舞魔杖并使其成为“安全数据”。问题在于,当数据被不同的软件解释时,“安全”的定义会发生变化,编码要求也会发生变化。同样,“有效”数据的概念因上下文而异 - 您的数据可能需要特殊字符(',“,&,<) - 请注意,SO 允许所有这些作为数据。
嵌入到 SQL 查询中的输出可能是安全的,嵌入到 HTML 中可能并不安全。或者斯威夫特。或者 JSON。或者 shell 命令。或 CSV。剥离(或完全拒绝)值,以便它们可以安全地嵌入到所有这些上下文(以及许多其他上下文)中,这太严格了。
那么我们该怎么办呢?确保数据永远不会造成伤害。实现这一点的最好方法是首先避免对数据进行解释。参数化 SQL 查询就是一个很好的例子;这些参数永远不会被解释为 SQL,它们只是由数据库作为数据处理。
相同的数据可用于其他格式,例如 HTML。在这种情况下,数据应该在嵌入时针对该特定语言进行编码/转义。因此,为了防止 XSS,数据在放入输出时应该是 HTML 转义的(或者 javascript 或 URL 转义的)。不在输入时。这同样适用于其他嵌入情况。
那么,我们是否应该直接传递任何我们得到的东西呢?
否 - 您肯定可以检查有关用户输入的内容,但这与上下文高度相关。我们称之为 - 验证。确保在服务器上完成此操作。一些例子:
- 您通常应该验证任何字符串是否仅包含其编码的有效字符(例如,没有无效的 UTF-8 序列)
- 如果字段应该是整数,您当然可以验证此字段以确保它包含整数(或者可能是 NULL)。
- 您通常可以检查特定值是否为一组已知值之一(白名单验证)
- 您可以要求大多数字段具有最小和最大长度。
为什么确保有效的 UTF-8 很重要?因为无效的 UTF-8 序列是绕过验证(尤其是黑名单验证)或将可见输入伪装成其他内容的好方法。它们经常被技术堆栈的不同层以不同的方式解释。请参阅 UTF-8 是否存在任何安全漏洞?,了解有关此类攻击的更多详细信息。
评论