1

我有一个充满了结构的集合,如下所示:

{
  "_id": {
      "$oid": "xxxxxxxxxxxxxxxxxx"
   },
  "sections": {
      "Some Cool Section" : {
        "sources" : ["source1", "source2", "source3"]
      }
      "An Awesome Section" : {
        "sources" : ["source1", "source2", "source3"]
      }
   },
  "username": "boatzart"
}

我需要允许用户任意添加新的“部分”,所以使用 pymongo 我可以添加如下部分:

userid = bson.ObjectId('xxxxxxxxxxxxxxxxxx')
sectionname = getUnsafeUserInput()
mongo.db.userprofiles.update({'_id' : userid},
  { '$set' : { 'sections.'+sectionname: { 'sources': []} } }
    )

因为 sectionname 来自不安全的用户输入,一些恶意用户可以通过在他们的 section name 中添加句点之类的东西来真正搞砸数据库。我可以轻松地清除非字母数字字符,但我觉得应该有更好的方法来做到这一点。

有没有更好的方法将嵌套字段插入到不需要我清理内容的现有文档中?

如果不是,那么我应该认为哪些字符不安全?所有非字母数字?只有时期?句号和美元符号?

4

1 回答 1

1

如果您可以重新设计架构,那么将这些用户定义的部分名称视为值而不是键应该更干净:

{
  "_id": {
      "$oid": "xxxxxxxxxxxxxxxxxx"
  },
  "sections": [{
        "name": "Some Cool Section",
        "sources" : ["source1", "source2", "source3"]
      }, {
        "name": "An Awesome Section",
        "sources" : ["source1", "source2", "source3"]
      }
  ],
  "username": "boatzart"
}

使用动态键名很少是一个好主意,因为它会使查询和更新变得混乱。

于 2013-01-04T03:56:06.033 回答