Azure 函数中针对 Cosmos DB 的 SQL 注入

SQLInjection against CosmosDB in an Azure function

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

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

如您所见,我发送的 'name' 没有 sanitizing。这里有什么 SQLInjection 问题吗?

我搜索并注意到 parameterization 可用,但我无能为力。

发生绑定时 (the data from the HTTP Trigger gets sent to the Cosmos DB Input bind),它会通过 SQLParameterCollection 处理清理。

请查看this article:

Parameterized SQL provides robust handling and escaping of user input, preventing accidental exposure of data through “SQL injection”

这将涵盖任何通过 name 属性.

注入 SQL 的尝试

如果您使用 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;
    }
}