0

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

我的问题如下:

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

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

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

此时我们不能正常使用它,因为它在数据库中已经是转义形式了。

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

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

4

1 回答 1

3

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

因为 SQL 转义字符串是由数据库解释的,所以它出现时没有转义。
因为 HTML 是由浏览器解释的,所以它在没有编码实体的情况下向用户显示。

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

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

另请参阅伟大的逃避现实(或:使用文本中的文本您需要知道的内容)

于 2013-10-30T13:53:16.410 回答