如何避免保存转义数据


How to avoid saving escaped data?

正如我之前所读到的,将原始数据从用户输入保存到数据库是一种很好的做法,因为以后它可能在不同的上下文中使用,并且需要根据它将出现的上下文以不同的方式进行转义。

我的问题如下:

  1. 例如,用户写了一篇文章并点击了保存按钮。它以原始形式保存到数据库中(SQL 转义可能在保存之前)。

  2. 稍后当用户想要编辑同一篇文章时,我们将转义文本,因为当我们在编辑器中显示它时,它将出现在 html 上下文中。因此,用户将获得文章的 html 转义版本。

  3. 编辑文章后,用户将保存已经转义的文本版本,我们将以"原始"(html 转义)形式将其保存到数据库中。

此时我们无法正常使用它,因为它已经在数据库中处于转义形式。

不必是文章,想象它是一个用户的名字。我们必须转义它,因为当它出现在管理站点中时,我们需要确保管理员不会被 xssed 使用。当管理员编辑并保存名称时,它将以转义形式保存。用户将无法再次登录,因为他的名字(例如)包含一个撇号 (') 字符,并且它被转义为 '或 '并且用户永远不会输入其名称的转义形式。

处理此类问题的正确方法是什么?如果我在保存之前取消转义输入,我将违反以原始形式保存数据的原则,当用户发送未转义的数据(新文章)时,我可能会得到错误的结果。

转义的数据始终取决于其上下文
'Foo & ''Bar'' & Baz'作为SQL字面意思是"Foo&'Bar'&Baz"。
Foo & 'Bar' & Baz在HTML中的意思是"Foo&'Bar'&Baz"。

由于 SQL 转义字符串由数据库解释,因此它显示时没有转义。
由于 HTML 由浏览器解释,因此它不会向用户显示编码的实体。

转义是一种完整传输数据的机制。它不会永久更改数据。用户总是看到原始数据,一旦它被他正在查看的技术"过滤器"解释

如果您确实遇到数据似乎在不应该转义的地方转义的问题,那么您在某处转义了太多次。

另请参阅大逃避主义(或:处理文本中的文本需要知道的内容)。