1

我遇到了一个问题,通过用硬值替换参数,我的 SQL Server 查询的性能得到了显着提高。例如:

SELECT * FROM Table1 WHERE RowNumber >= 101 AND ID < 200

明显快于以下:

DECLARE @Start int = 101;
DECLARE @End Start int = 200;

SELECT * FROM Table1 WHERE RowNumber >= @Start AND RowNumber < @End

第一个在大约 2 秒内运行,第二个在 15 秒内运行。所以我的问题是,如果它们是数字和 pnly 参数化字符串,我可以安全地使用硬值吗?我不认为这是索引问题,因为 RowNumber 列已经被索引为非聚集索引。我并不熟悉所有的 SQL 注入技术,但多年来我一直在为所有输入值使用参数,以试图避免 SQL 注入攻击。我从来没有完全意识到使用参数可能会降低性能。

我也看到了一些关于使用参数降低性能的问题,但我还没有看到任何关于如何解决问题的明确答案。

4

3 回答 3

3

无论如何,我想说,鉴于“我对所有 SQL 注入技术并不熟悉”这句话,那么您应该始终保持安全并继续进行参数化查询。

我在用户组中就 SQL 注入攻击进行了一次演讲,但我并不认为我什么都知道。我以为我对攻击发生的各种方式了解很多,但我什至让一个人在谈话后找到我,告诉我在他工作的一家公司发生的一次攻击,攻击是通过一个由 OCR 机器读取的纸质表格。我以前从未考虑过这种形式的攻击。

攻击以各种奇怪的方式发生,即使您已经想到了所有可能的方法,其他人总是会设法想到其他方法来攻击系统。

于 2012-08-10T15:50:05.633 回答
0

数字字段很危险,因为注释(///)和空格会导致 SQL 注入(攻击)

如果用户和密码匹配,许多站点允许用户进入保留区域。

假设一个疯狂的网站使用数字字段作为密码:

 .....  Where User='James' and Pass=123

即使在 Javascript 中验证用户输入,也很容易更改帖子值:因此,可以“注入”下面的部分而不是 123

             123  or 1=1  

返回所有记录。许多站点检测到这种情况,但是用户字段是“用户”或“用户名”是很常见的。因此可以尝试向下结构中的“用户”和其他常见字段名称

            12  or 1=1  and User='James'  

在这种情况下,只会返回所需的记录!

数字字段的一个简单解决方案是使用单引号:

                  Select User='James' and Pass='123'

我已经验证 SQL Server、MySQL 和 SQLite 接受这种语法,可能会有轻微的多收费用。由于电子邮件、姓名等原因,避免在字符串中使用单引号更加困难。

于 2013-01-26T04:12:28.667 回答
0

SQL Server 会提前计算一些常量表达式以提高查询性能。这称为常量折叠。

在上面的查询中,与编译查询之前一样,将评估常量,优化器不需要做任何事情。但是对于参数,优化器必须在每次运行时编译它。

于 2012-08-10T15:50:13.043 回答