sql-injection - 动态 WHERE 子句和 SQL 注入(inject)

标签 sql-injection

我需要为用户创建功能以确定选择的 WHERE 标准 - 该标准将是动态的。

有没有一种方法可以在不向 SQL 注入(inject)开放我的代码的情况下实现这一点?

我正在使用 C#/.NET Windows 应用程序。

最佳答案

使用参数化查询将大大有助于保护您免受 SQL 注入(inject)攻击,因为大多数坏事都发生在 where 条件的值部分。

例如给定条件 a=="hello"&& b=="WORLD",执行此操作:

select a,b,c,d
from table
where a=@pa and b=@pb -- this is generated dynamically

然后,绑定(bind) @pa="hello"@pb="WORLD",然后运行您的查询。

在 C# 中,您将从手头的 where 子句的内存表示开始,逐个元素地遍历它,并生成两个输出对象:

  • 带有 where 子句的字符串,其中常量由自动生成的参数引用 papb 等替换(使用您的这些盲参数最喜欢的命名方案:实际名称无关紧要)
  • 名称-值对字典,其中名称对应于您在 where 子句中插入的参数,值对应于您从表达式表示中提取的常量。

有了这些输出,您就可以使用字符串准备动态查询,使用字典添加参数值,然后对 RDBMS 源执行查询。

不要这样做

select a,b,c,d
from table
where a='hello' and b='WORLD' -- This dynamic query is ripe for an interjection attack

关于sql-injection - 动态 WHERE 子句和 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8716354/

相关文章:

python - 使用python在sqlite select查询中动态搜索null

c# - 从用户输入中获取查询

mysql - 扫描网站数据库以查找黑客攻击迹象的方法

发现 SQL 注入(inject)漏洞

PHP——自动 SQL 注入(inject)保护?

asp.net - sql注入(inject)攻击

php - mySQL 创建未知数量值的 INSERT 存储过程

sql - Oracle - 为什么在存储过程中允许 EXECUTE IMMEDIATE?

mysql - 更改表名以避免 SQL 注入(inject)攻击

mysql - 我应该清理参数化查询的输入吗?