You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure函数中CosmosDB非参数化查询是否存在SQL注入风险?

确实存在严重的Cosmos DB SQL注入风险

你当前的写法绝对存在SQL注入风险——因为你直接把未经过任何验证、清理的用户输入{name}拼接到了查询语句里,攻击者完全可以构造恶意的参数值来篡改查询逻辑,甚至泄露敏感数据。

举个实际的注入场景

假设攻击者传入的name参数值是:') OR 1=1--,你的查询会被拼接成:

SELECT * FROM c.my_collection pm WHERE Contains(pm.first_name,') OR 1=1--')

这里的')会闭合原本的Contains函数参数,然后OR 1=1让条件永远为真,最后--注释掉了后面的括号。结果就是返回集合里所有的文档,完全绕过了你的过滤规则。如果攻击者构造更复杂的输入,还可能利用其他Cosmos DB语法做更多恶意操作(比如在有写权限的场景下篡改数据)。

既然不能用参数化查询,手动做输入清理是唯一的选择

因为你说暂时无法采用参数化方案,那必须对name参数做严格的清理和校验:

  • 转义特殊字符:Cosmos DB SQL里的单引号'是最危险的注入点,必须把单个单引号替换成两个单引号''(这是Cosmos DB识别转义单引号的方式)。除此之外,还要注意处理其他可能的特殊字符比如--、()等。
  • 限制输入长度:给name设置合理的长度上限(比如20-50个字符),避免攻击者传入过长的恶意字符串。
  • 校验输入格式:只允许合法的字符(比如字母、空格、少数常用符号),如果输入包含非法字符直接返回错误,拒绝处理请求。

举个C#的转义示例(如果你的Azure函数用C#开发):

// 先判断输入是否为空或包含非法字符,再转义单引号
if (string.IsNullOrEmpty(name) || name.Any(c => !char.IsLetter(c) && c != ' '))
{
    // 非法输入,返回错误
    return new BadRequestObjectResult("Invalid name parameter");
}
string sanitizedName = name.Replace("'", "''");
string query = $"SELECT * FROM c.my_collection pm WHERE Contains(pm.first_name,'{sanitizedName}')";

这样攻击者传入的') OR 1=1--会被转义成'') OR 1=1--,查询变成:

SELECT * FROM c.my_collection pm WHERE Contains(pm.first_name,''') OR 1=1--')

此时Contains会把整个字符串当作搜索目标,不会触发注入逻辑。

最后提一句

手动清理只能降低风险,永远不如参数化查询可靠——参数化查询会由Cosmos DB引擎自动处理输入的隔离和转义,从根源上杜绝注入。如果后续有机会重构,强烈建议切换到参数化方式,比如:

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

然后在代码中把@name绑定到用户传入的参数值。

内容的提问来源于stack exchange,提问作者Mori

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:01:00