![]() |
1
11
我将跳过SQL注入参数,这是众所周知的,只关注参数和非参数的SQL方面。 当您向服务器发送一个SQL批处理(任何批处理)时,必须对其进行分析以便于理解。与其他编译器一样,SQL编译器必须生成 AST 然后在语法树上操作。最终优化器将语法树转换为执行树,并最终生成一个实际运行的执行计划。回到大约1995年的黑暗时代,如果批处理是一个临时查询或存储过程,那么它会产生不同的效果,但是今天它完全没有,它们都是一样的。
现在,参数的区别在于,发送查询的客户机
如果以表单形式发送查询
你可以看看
SQL Server, SQL Statistics Object
服务器的性能计数器。柜台
|
![]() |
2
4
始终使用选项2)。 第一个 是 不是 安全考虑 SQL Injection attacks . 第二个 它不仅安全得多,而且性能也会更好,因为查询优化器有更好的机会为它创建一个好的查询计划,因为查询一直看起来都是一样的,当然需要参数。 |
![]() |
3
3
你为什么要避开选项1?
即使你似乎从
为什么鼓励您使用选项2SQL查询引擎能够缓存执行计划并管理向其抛出的各种查询的统计信息。因此,从长远来看,使用统一查询(最好是使用单独的存储过程)可以加快执行速度。 |
![]() |
4
2
我还没有听说过任何可以劫持参数进行SQL注入的例子。除非我看到它被证明是安全的,否则我会认为它们是安全的。 动态SQL不应该被认为是安全的。即使有“可信”的输入,这也是一个坏习惯。注意,这包括存储过程中的动态SQL;SQL注入也可能发生在存储过程中。 |
![]() |
5
1
因为您可以控制该值是一个整数,所以它们几乎是等价的。我通常不使用第一个窗体,通常也不允许第二个窗体,因为我通常不允许表访问,需要使用存储过程。尽管您可以在不使用参数收集的情况下执行SP,但我仍然建议使用SP 和 参数:
注意,尽管选项1是安全的 以你为例 ,当有人看到并使用带有非整数变量的技术时会发生什么-现在您正在培训人们使用 可以是 开放注射。 注意,即使应用程序代码有问题,也可以主动加强数据库以避免注入有效。对于应用程序使用的帐户/角色:
|
![]() |
6
1
就我个人而言,我总是习惯使用选项2。说的是: 由于您正强制将下拉值转换为int,这将提供一些针对SQL注入攻击的保护。如果有人试图向发布的信息中注入额外的信息,C会在试图将恶意代码转换为整数值时抛出异常,从而阻止尝试。 |
![]() |
John D · 需要为NULL或NOT NULL的WHERE子句 4 月前 |
![]() |
Marc Guillot · 记录值时忽略冲突 5 月前 |
![]() |
Fachry Dzaky · 正确使用ROW_NUMBER 5 月前 |
![]() |
TriumphTruth · 从满足特定条件的数据集中选择1行 5 月前 |