我实现了一个由HttpRequest触发的Azure功能。名为name
的参数作为HttpRequest的一部分传递。在 Integration
部分中,我使用了以下查询从CosmosDB中检索数据(作为输入):
SELECT * FROM c.my_collection pm
WHERE
Contains(pm.first_name,{name})
如你所见,我发送了这个名字'没有sanitizing
它。这里有SQLInjection
个问题吗?
我搜索并注意到parameterization
可用,但这不是我在这里可以做的任何事情。
答案 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;
}
}