正如我之前所读到的,将用户输入的原始数据保存到数据库中是一种很好的做法,因为以后它可能会在不同的上下文中使用,并且需要根据将出现的上下文进行不同的转义。
我的问题如下:
例如,用户写了一篇文章并点击了保存按钮。它以原始形式保存到数据库中(SQL 可能在保存之前转义)。
稍后当用户想要编辑同一篇文章时,我们将对文本进行转义,因为当我们在编辑器中显示它时它会出现在 html 上下文中。因此用户将获得文章的 html 转义版本。
编辑文章后,用户将保存已经转义的文本版本,我们将以“原始”(html 转义)形式将其保存到数据库中。
此时我们不能正常使用它,因为它在数据库中已经是转义形式了。
不一定是文章,想象它是一个用户的名字。我们必须逃避它,因为当它出现在管理站点中时,我们需要确保管理员不会被 xssed。当管理员编辑并保存名称时,它将以转义形式保存。用户将无法再次登录,因为他的名字(例如)包含一个撇号 (') 字符并且它被转义为‘’。或 ' 并且用户永远不会输入他的名字的转义形式。
处理此类问题的正确方法是什么?如果我在保存之前对输入进行转义,我将违反以原始形式保存数据的原则,并且当用户发送未转义的数据时我可能会得到错误的结果(新文章)。