如何避免保存转义数据?

时间:2013-10-30 13:28:30

标签: php html escaping

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

我的问题如下:

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

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

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

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

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

    处理此类问题的正确方法是什么?如果我在保存之前忘记输入,我会违反以原始格式保存数据的原则,当用户发送未转义的数据时,我可能会得到错误的结果。(/ p>

1 个答案:

答案 0 :(得分:3)

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

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

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

如果你确实遇到了数据在不应该出现的地方出现问题的问题,那么你在某个地方逃脱的时间太多了。

另见The Great Escapism (Or: What You Need To Know To Work With Text Within Text)