SuperAPI AI 工具集

prevent-sql-injection

安全与审计

查看项目

更新于 10-16 00:31

技能介绍

用途:在 Azure SQL Database 上处理参数化无法覆盖的 SQL 注入面,包括标识符、运行时选择的排序表达式类型、动态批处理运行权限以及加密列。

主要能力与要点:

  1. 用可复现对比说明参数是值、拼接是代码:同一输入经 sp_executesql 类型化参数返回 0 行,拼接后返回全部行。
  2. 参数无法绑定标识符。QUOTENAME 输入为 sysname,超过 128 字符或引号字符不合法时返回 NULL,而 NULL 会让整个批处理变为 NULL,且不报任何严重级别错误;需显式检查 NULL。QUOTENAME 与 PARSENAME 都不检查对象是否存在,存在性只能查目录视图(如 sys.objects 与 sys.schemas),或对已知合法标识符使用允许列表。
  3. 动态 ORDER BY 中单个 CASE 跨不同类型列会按类型优先级强制统一类型,导致部分排序键报 Msg 206、241 或 245,且 BEGIN TRY 无法捕获编译期错误。建议每个候选列一个 CASE,各自只含一种类型,再配合 OFFSET/FETCH 与方向切换。
  4. 动态 SQL 会破坏所有权链,引擎按调用者权限检查语句触及的每个对象。可用 EXECUTE AS(整个模块替换调用者权限,嵌套模块继承代理上下文,身份函数返回代理身份)或证书签名(合并权限、保留执行上下文,但每次变更需重新签名)。涉及安全策略下的表时需先评估代理上下文对租户谓词的影响。
  5. Always Encrypted 列与字面量比较或插入会报 Msg 206,只有通过启用 Column Encryption Setting=Enabled 的连接以参数绑定才能返回行。

使用方式:按文中示例在测试库运行验证;用 sys.sql_modules 与 sys.objects 查询所有构建 SQL 的模块及其 execute_as_principal_id;对每个可能传入的排序键逐一运行生成的 ORDER BY。

限制:资料未提供安装命令、收费、平台支持范围或性能数据;部分内容(如 Always Encrypted)为文档说明而非实测复现。不要将 QUOTENAME 视为对调用者提供标识符的充分防护,也不要声称两个辅助函数会检查对象存在性。