动态SQL中的区别黑白字符串连接和绑定变量

时间:2019-05-23 09:02:22

标签: sql oracle plsql

相当多的标题。我想知道字符串串联之间在行为和性能上是否存在差异

var_name := 'SKING';
sql := 'select * from emp where ename = ' || var_name;
execute immediate sql;

并绑定变量

sql := 'select * from emp where ename = :1';
execute immediate sql
using var_name;
在动态SQL中

。谢谢!

1 个答案:

答案 0 :(得分:6)

如果var_name包含

这样的字符串,则行为上可能存在巨大差异
'A' AND 1=2 UNION SELECT password, null, null ... FROM users WHERE username='admin'

在第一个示例中,您可能只是操纵数据库转储了管理员密码(哈希)或其他敏感信息。如果这是作为绑定变量完成的,那么您将获得0行,除非确实有一个名称为'A' AND 1=2 UNION ...

的员工

如果您的员工姓名更无害Peter O'Toole或其他带有合法'字符的东西,则第一个查询甚至会导致崩溃

https://bobby-tables.com详细介绍了有关SQL注入黑客的行为

始终总是使用绑定变量。当您可以用变量名代替

时,用字符串将连接到查询中就没有任何借口。

-

关于性能,如果它知道查询的哪些部分可以更改并且哪些部分是固定的,则可以帮助数据库查询优化器计划查询和缓存执行计划。如果将值串联在一起,则无法分辨下一次声明可能有所不同的值与保持不变的值之间的区别

SELECT * FROM emp WHERE emp_type = 'manager' and emp_name = :name

以上,尽管名称可能有所不同,但优化器可以轻松推断出此查询将始终仅返回管理器类型,这可能会影响数据访问和索引策略,并且可能会对性能产生影响。很难具体说明,因为优化器是一个黑匣子。但是请放心,由于良好的旧资本主义/市场力量(谁购买了缓慢的数据库?),它会努力从可用的信息中获得最佳性能。因此请帮忙。