编码用户输入以存储在MongoDB中

Eth*_*han 5 javascript python unicode ajax mongodb

我正在尝试确定在MongoDB中存储和显示用户输入的最佳实践.显然,在SQL数据库中,需要对所有用户输入进行编码以防止注入攻击.但是,我的理解是,对于MongoDB,我们需要更加担心XSS攻击,用户输入是否需要在存储在mongo中之前在服务器上进行编码?或者,使用像把手这样的模板库,只需在字符串显示在客户端之前对其进行简单编码就足够了吗?

这是我正在谈论的流程:

  1. 在客户端,用户将其名称更新为"<script> alert('hi'); </ script>".
    • 这是否需要转义为"< script> alert(' hi');</ script>" 在发送到服务器之前?
  2. 更新后的字符串通过ajax请求传递到JSON文档中的服务器.
  3. 服务器将字符串存储在"user.name"下的mongodb中.
    • 为了安全起见,服务器是否需要以相同的方式转义字符串?是否必须首先在完全转义之前解除字符串的转义,以免在'&'上加倍?
  4. 稍后,客户端请求用户信息,并在JSON ajax响应中发送名称字符串.
  5. 在显示之前,用户名使用_.escape(name)等编码.

这个流程是否会显示正确的信息并且不受XSS攻击的影响?关于汉字这样的unicode字符怎么样?

这也可以改变文本搜索的完成方式,因为如果所有用户文本都被编码,则在开始搜索之前可能需要对搜索项进行编码.

非常感谢!

bob*_*nce 4

"&lt;script&gt;alert(&#x27;hi&#x27;);&lt;&#x2F;script&gt;"在将其发送到服务器之前是否需要转义?

不,必须在它最终进入 HTML 页面之前对其进行转义 - 上面的步骤 (5)。

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

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

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

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