1 回答
TA贡献1898条经验 获得超8个赞
输入清理是一个误导性术语,表示您可以对所有数据挥动魔杖并将其设为“安全数据”。问题是当数据被不同的软件解释为编码要求时,“安全”的定义会发生变化。同样,“有效”数据的概念因上下文而异——您的数据很可能需要特殊字符('、、&、<)——请注意,SO 允许所有这些作为数据。
可以安全嵌入到 SQL 查询中的输出可能不安全地嵌入到 HTML 中。或斯威夫特。或 JSON。或外壳命令。或 CSV。并且剥离(或彻底拒绝)值以便它们可以安全地嵌入所有这些上下文(以及许多其他上下文)中,限制性太强。
那么我们应该怎么做呢?确保数据永远不会造成损害。实现这一点的最佳方法是首先避免解释数据。参数化 SQL 查询就是一个很好的例子;参数永远不会被解释为 SQL,它们只是作为数据放入数据库中。
相同的数据可用于其他其他格式,例如 HTML。在这种情况下,数据应在嵌入时针对该特定语言进行编码/转义。因此,为了防止 XSS,数据在被放入输出时应该是 HTML 转义(或 javascript 或 URL 转义)。不是在输入时。这同样适用于其他嵌入情况。
那么,我们应该直接将我们得到的任何东西传递给数据库吗?
不 - 您肯定可以检查有关用户输入的内容,但这高度依赖于上下文。让我们称其为 - 验证。确保这是在服务器上完成的。一些例子:
如果一个字段应该是一个整数,你当然可以验证这个字段以确保它包含一个整数(或者可能是 NULL)。
您通常可以检查特定值是否是一组已知值中的一个(白名单验证)
您可以要求大多数字段具有最小和最大长度。
您通常应该验证任何字符串仅包含对其编码的有效字符(例如,没有无效的 UTF-8 序列)
如您所见,这些检查非常依赖于上下文。所有这些都是为了帮助增加您最终获得有意义数据的几率。它们不应该是保护您的应用程序免受恶意输入(SQL 注入、XSS、命令注入等)的唯一防御,因为这不是这样做的地方。
- 1 回答
- 0 关注
- 198 浏览
添加回答
举报
