正如我之前读到的,将原始数据从用户输入保存到数据库是一个好习惯,因为以后它可能在不同的上下文中使用,并且需要根据它将出现的上下文进行不同的转义。英寸
我的问题如下:
例如,用户编写文章并点击“保存”按钮。它以原始形式保存到数据库中(在保存之前可以转义SQL)。
稍后当用户想要编辑同一篇文章时,我们将转义文本,因为当我们在编辑器中显示它时它将出现在html上下文中。因此,用户将获得该文章的html转义版本。
在编辑文章后,用户将保存已经转义的文本版本,我们将以“原始”(html转义)形式将其保存到数据库中。
此时我们无法正常使用它,因为它已经在数据库中以转义形式存在。
没有必要成为文章,想象它是用户的名字。我们必须逃避它,因为当它出现在管理站点时,我们需要确保管理员不会被删除。当管理员编辑并保存名称时,它将以转义形式保存。用户将无法再次登录,因为他的名字(例如)包含一个撇号(')字符,并且它被转义为& amp;或'并且用户永远不会输入他的名字的转义形式。
处理此类问题的正确方法是什么?如果我在保存之前忘记输入,我会违反以原始格式保存数据的原则,当用户发送未转义的数据时,我可能会得到错误的结果。(/ p>
答案 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)。