Azure函数中针对CosmosDB的SQLInjection

时间:2018-01-22 09:52:20

标签: azure sql-injection azure-cosmosdb azure-functions

我实现了一个由HttpRequest触发的Azure功能。名为name的参数作为HttpRequest的一部分传递。在 Integration 部分中,我使用了以下查询从CosmosDB中检索数据(作为输入):

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

如你所见,我发送了这个名字'没有sanitizing它。这里有SQLInjection个问题吗?

我搜索并注意到parameterization可用,但这不是我在这里可以做的任何事情。

2 个答案:

答案 0 :(得分:4)

当绑定发生时(the data from the HTTP Trigger gets sent to the Cosmos DB Input bind),它将通过将处理清理的name传递。

请查看this article

  

参数化SQL提供强大的处理和用户输入转义,防止通过“SQL注入”意外暴露数据

这将涵盖通过{{1}}属性注入SQL的任何尝试。

答案 1 :(得分:3)

如果您使用的是Microsoft.Azure.Cosmos而不是Microsoft.Azure.Documents:

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;
    }
}