【发布时间】:2021-12-03 03:02:50
【问题描述】:
我有一个使用大量字符串插值进行 SQL 查询的应用程序。我知道这是一个 SQL 注入威胁,这是客户和我们都知道的事情,希望我们可以专注于下一次重大重构。我这样说是为了理解来自 GUI 的 {Root Container.property} 东西。
我有这个问题
IF ({Root Container.UserSelectedProduct}=1)
begin
DECLARE @TestNumbers {Root Container.SQLProductType};
INSERT INTO @TestNumbers SELECT * FROM {Root Container.DBTable};
SELECT *
FROM {Root Container.SQLProductFunction} (@TestNumbers)
WHERE [ID] = {Root Container.Level};
end
else
Select 0
在用户选择产品之前,它看起来像这样
IF (0=1)
BEGIN
DECLARE @TestNumbers myDataType;
INSERT INTO @TestNumbers SELECT * FROM [MySchema].[TheWrongTable];
SELECT * FROM [dbo].[myfunction] (@TestNumbers)
WHERE [ID] = 1;
END
ELSE
SELECT 0
这给了我错误:
列名或提供的值的数量与表定义不匹配。
我知道为什么会出现此错误,我从中选择的表不是为该数据类型创建的。
但是,当我有IF (0=1) 时,为什么它甚至试图运行第一个 IF 子句 - 为什么这部分不只是跳过,而 SELECT 0 只运行?我原以为这就是它应该如何工作的,但是我不断收到有关列名/编号与表定义不匹配的错误。当用户确实选择了一个产品并且我得到了IF (1=1) 并且我有适当的表/函数/数据类型时,这一切都很顺利。我只是不知道为什么在 IF(1=0) 之前它会抛出一个错误。为什么会发生这种情况/我如何才能获得我的预期行为,即我的第一个 IF 语句下的 BEGIN\END 中的所有内容都不会运行,除非表达式为真。
【问题讨论】:
标签: sql sql-server tsql sql-server-2016