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
相关产品推荐
相关产品推荐

