何时转义用户输入

信息安全 Web应用程序 攻击预防
2021-08-22 05:56:14

我想知道何时是处理转义用户输入的最佳方式。

我想到了两个选择

1)用户将数据发送到服务器,我们对其进行转义,然后将其存储到数据库中 2)我们按原样存储数据并在向用户发送数据时对其进行转义。

对我来说,转义然后将数据保存到数据库似乎要容易得多,但是假设有人在我们的网站中找到了流量并设法避免转义,我们遇到了查找我们存储到数据库中的所有数据未转义的问题

另一方面,如果我们只是按原样存储数据,但一旦我们将其发送给用户就将其转义,即使有人在我们的网站上发现了流量,我们所要做的就是修复错误,因为我们的系统已经假设保存在数据库中的数据没有转义.

尽管第二种方法似乎更容易,但似乎更容易出错。假设我们在服务器上生成 HTML 并将其发送给用户,然后决定切换到仅通过 ajax 向用户发送内容,很容易忘记我们需要在将所有数据发送给用户或实现新的 API 或其他东西之前转义所有数据第三。

所以我想知道处理这个问题的更好方法是什么?

2个回答

用户输入是一个字符串。当您想将一些字符插入某些 HTML / SQL / 任何坚持将某些字符解释为特殊功能的代码时,就会进行转义。例如,您有一个 '<' 并且希望它以 '<' 的形式显示给用户,但是如果您将字符串粗暴地粘贴到 HTML 中,那么客户端的 Web 浏览器将查看 '< ' 并认为它开始一些 HTML 标记,而不是表示一个简单的 '<'。

通常,您希望将字符串保留为字符串,并将任何编码或转义委托给可以很好地执行此操作的专用函数。例如,对于 SQL,您使用准备好的语句使用 PHP 上下文中的 HTML,您可以使用htmlspecialchars().

这里要注意的一点是,您需要执行的转换、编码或转义类型取决于您尝试对字符串执行的操作。如果您需要将字符串放入某些 HTML 中,那么您将使用 HTML 实体(&lt;for '<' 等)。如果您将已转义的字符串存储在数据库中,那么您打赌您只会通过将其包含在某些 HTML 中来使用该字符串。

因此,您应该努力仅在使用时应用编码/转义。它更灵活,使语义更简单。在您的数据库中,将字符串存储为字符串。

编辑: Luc 在概念中指出我过度倾向于高性能解决方案。如果在您的情况下,性能不是问题,那么单独存储原始数据并在输出中转换它是完全可以接受的(事实上也是更可取的)。这使您可以灵活地使用数据,而无需维护版本。

下面的原始答案--------------------------------------------------------- --------

在某种程度上,这取决于。首先,答案很少是存储原始数据并在您读回原始数据时将其转义。

两种常见的解决方案是:

1)在存储之前转义数据。

2) 存储两份数据副本,一份转义数据,一份原始数据。

在几乎任何系统中,读取与写入的比率都将严重偏向读取。可能是 10:1,但也可能是 10,000:1。这就是为什么您希望以转义格式存储数据并且仅在您编写它时解析它,而不是每次您想要读取它时解析它。

存储这两种格式的好处是原作者可以按预期修改内容,您可以根据需要重新处理它,您可以查看原始数据......它为您提供了一些额外的灵活性,但代价是一些额外的复杂。

这显然有点简单,例如我没有考虑缓存对读/写比率的影响,但它希望它传达了一般概念。