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;
}
}
我已经实现了一个由 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
属性.
如果您使用 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;
}
}