代码之家  ›  专栏  ›  技术社区  ›  Mori

Azure函数中针对CosmosDB的SQLInjection

  •  5
  • Mori  · 技术社区  · 8 年前

    我实现了一个由HttpRequest触发的Azure函数。调用的参数 name 作为HttpRequest的一部分通过。在里面 Integration 第节中,我使用以下查询从CosmosDB检索数据(作为输入):

    SELECT * FROM c.my_collection pm 
    WHERE
    Contains(pm.first_name,{name}) 
    

    如你所见,我发送的“姓名”没有 sanitizing 它有没有 SQLInjection 关注点在这里?

    我搜索并注意到 parameterization 是可用的,但我在这里无能为力。

    2 回复  |  直到 8 年前
        1
  •  4
  •   Matias Quaranta    8 年前

    绑定发生时( the data from the HTTP Trigger gets sent to the Cosmos DB Input bind ),它通过一个 SQLParameterCollection 这将处理消毒。

    请查看 this article :

    参数化SQL提供了对用户输入的可靠处理和转义,防止了通过SQL注入意外暴露数据

    这将涵盖通过 name 所有物

        2
  •  3
  •   Mehdi Benmoha    5 年前

    如果您使用的是Microsoft。蔚蓝色的Cosmos而不是Microsoft。蔚蓝色的文件:

    public class MyContainerDbService : IMyContainerDbService
    {
        private Container _container;
    
        public MyContainerDbService(CosmosClient dbClient)
        {
            this._container = dbClient.GetContainer("MyDatabaseId", "MyContainerId");
        }
    
        public async Task<IEnumerable<MyEntry>> GetMyEntriesAsync(string queryString, Dictionary<string, object> parameters)
        {
            if ((parameters?.Count ?? 0) < 1)
            {
                throw new ArgumentException("Parameters are required to prevent SQL injection.");
            }
            var queryDef = new QueryDefinition(queryString);
            foreach(var parm in parameters)
            {
                queryDef.WithParameter(parm.Key, parm.Value);
            }
            var query = this._container.GetItemQueryIterator<MyEntry>(queryDef);
            List<MyEntry> results = new List<MyEntry>();
            while (query.HasMoreResults)
            {
                var response = await query.ReadNextAsync();
                results.AddRange(response.ToList());
            }
    
            return results;
        }
    }
    
    推荐文章