我正在尝试确定在MongoDB中存储和显示用户输入的最佳做法。显然,在SQL数据库中,所有用户输入都需要进行编码以防止注入(inject)攻击。但是,我的理解是,对于MongoDB,我们需要更加担心XSS攻击,因此在将用户输入存储在mongo中之前,是否需要在服务器上对用户输入进行编码?或者,仅使用模板之类的模板库在字符串显示在客户端上之前立即对字符串进行简单编码就足够了吗?

这是我正在谈论的流程:

  • 在客户端,用户将其名称更新为“”。
  • 将它发送到服务器之前是否需要转义到“”?
  • 更新的字符串通过ajax请求以JSON文档的形式传递到服务器。
  • 服务器将字符串存储在mongodb中的“user.name”下。
  • 为了安全起见,服务器是否需要以相同的方式对字符串进行转义?是否必须在完全转义之前先取消转义字符串,以免在'&'上加倍?
  • 稍后,客户端请求用户信息,并在JSON ajax响应中发送名称字符串。
  • 在显示之前,用户名使用_.escape(name)之类的东西进行编码。

  • 该流程将显示正确的信息并免受XSS攻击吗?像汉字这样的Unicode字符呢?

    这也可能会改变文本搜索的方式,因为如果所有用户文本都已编码,则在开始搜索之前可能需要对搜索词进行编码。

    非常感谢!

    最佳答案



    不,它必须像在HTML页面中结束之前那样进行转义-上面的步骤(5)。

    当将文本注入(inject)到新的周围环境中时,必须应用正确的转义类型。这意味着您可以在将数据包含在HTML页面中时对其进行HTML编码。理想情况下,您使用的是现代模板系统,该模板系统会自动为您进行转义。

    (类似地,如果您在<script>块中的JavaScript字符串文字中包含数据,则必须对其进行JS编码;如果在样式表规则中包含数据,则必须对其进行CSS编码,依此类推。如果我们使用的是SQL将数据注入(inject)到字符串中的查询,那么我们将需要对SQL进行转义,但是幸运的是,Mongo查询通常是使用JavaScript对象而不是字符串语言来完成的,因此不必担心转义。)

    数据库不是HTML上下文,因此在对数据库进行输入过程中对HTML编码的输入数据进行HTML编码是不正确的。

    (除注入(inject)外,还有其他XSS来源,最常见的是不安全的URL方案。)

    关于javascript - 编码要存储在MongoDB中的用户输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22312452/

    10-09 23:48
    查看更多