如何使用 C# mongodb 驱动程序防止 SQL 注入?

Posted

技术标签:

【中文标题】如何使用 C# mongodb 驱动程序防止 SQL 注入?【英文标题】:How to prevent SQL injection using C# mongodb driver? 【发布时间】:2020-11-19 04:19:34 【问题描述】:

我正在使用 C# Mongodb 驱动程序在 Mongodb 中插入/更新数据。我已经通过“Qualys”扫描了我的 web api,它被插入到我的一个名为“createdOn”的字段中,我在下面提供了示例数据。

1.中太平洋标准时间 + (SELECT 0 FROM (SELECT 2. SLEEP(29))qsqli_1111) 中太平洋标准时间',0,0);WAITFOR 3. DELAY'00:00:29'-|ping -c2 -i91 localhost|

能否请您帮我解决这个问题。

【问题讨论】:

我对@9​​87654321@不熟悉,但我知道SELECT 0 FROM ###和Mongo没什么共同点 请告诉我,是否可以防止这种类型的数据注入? 我仍然面临 SQL 注入问题,请任何人帮助我解决这个问题。 @Aravinth 向我们展示了一些代码。你是如何构建你的 NoSQL 查询的?就像 dododo 所说的那样,您分享的内容看起来不像 NoSQL 查询。它看起来更像是 SQL 注入,因为 Qualys 似乎“注入”了 SLEEP 命令 感谢您的回复@RomanCanlas。请参考下面我用来从集合中检索数据的代码。是否有可能使用 NoSQL/SQL 注入进行攻击,如果有,如何预防。 var _chatSessionCollection = Db.GetCollection(ConfigurationManager.AppSettings["chatsession"]); JObject dateFilter = new JObject(); jFilter.Add("botId", 1); jFilter.Add("status", status); var _chatSessionList = _chatSessionCollection.Find(Convert.ToString(jFilter)).ToList(); 【参考方案1】:

可能会在其中一个过滤器(状态)中注入任意代码。如果您只是期望接受字符的有限列表,我建议实施白名单

注意:我没有测试下面的代码,但我希望你能明白要点

Regex regex = new Regex(@"^[a-zA-Z0-9\s,]*$");  // alphanumeric pattern

if (regex.IsMatch(status)) 
    chatSessionCollection = Db.GetCollection<ChatSessionModel(ConfigurationManager.AppSettings["chatsession"]); 
    JObject dateFilter = new JObject(); 
    jFilter.Add("botId", 1); 
    jFilter.Add("status", status); 
    var _chatSessionList = _chatSessionCollection.Find(Convert.ToString(jFilter)).ToList(); 
   
else 
  return false;

【讨论】:

感谢@Roman Canlas,我将使用您的代码 sn-p。我相信主要目标是从输入数据中删除“$”符号。对吗? 没有。目标是只接受列入白名单的字符。我们不打算删除任何字符,但您也可以这样做,但它不会像将恕我直言列入白名单那样有效。你说的不一样,是消毒的过程。 我理解并感谢您的回复@Roman Canlas

以上是关于如何使用 C# mongodb 驱动程序防止 SQL 注入?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 驱动程序更新 MongoDB 数组中的子文档

如何使用 C# 驱动程序在 MongoDB 中更新和更新多个文档

Mongodb 如何使用 C# 驱动程序更新许多文档

如何使用官方 c# 驱动程序在 MongoDB 中使用 Update.Set 更新多个字段?

C# MongoDB:如何正确映射域对象?

如何在 C# 的 MongoDB 驱动程序中应用软删除过滤器?