我有一个有趣的情况,我正在尝试选择sql server表中的所有内容,但我只需要通过旧的公司API而不是SQL来访问该表。此API要求提供表名,字段名和值。然后以这种方式插入它非常简单:
select * from [TABLE_NAME_VAR] where [FIELD_NAME_VAR] = 'VALUE_VAR';
我无法将=符号更改为!=或其他任何内容,只有那些变量。我知道这听起来很糟糕,但是我不能在不经过大量工作的情况下更改API,这就是我必须要做的事情。
此表中有多个列都是数字,所有字符串,并设置为非null。是否有值我可以通过此API函数返回表中的所有内容?也许是一个常数或特殊值,这意味着它是一个数字,它不是数字,它是一个字符串,*,它不是空的等等?有什么想法吗?
答案 0 :(得分:5)
如果API构造正确,则无法做到这一点。
然而,如果这是一些本土生物,它可能不是。您可以尝试输入YourTable]--
作为TABLE_NAME_VAR
的值,以便在插入查询时最终为
select * from [YourTable]--] where [FIELD_NAME_VAR] = 'VALUE_VAR';
如果]
被拒绝或正确转义(通过加倍),这将无效。
答案 1 :(得分:2)
这是一个简单的例子, 希望它可以帮助
declare @a varchar(max)
set @a=' ''1'' or 1=1 '
declare @b varchar(max)
set @b=('select * from [TABLE_NAME_VAR] where [FIELD_NAME_VAR]='+@a)
exec(@b)
答案 2 :(得分:2)
如果您的API允许列名而不是常量,
select * from [TABLE_NAME_VAR] where [FIELD_NAME_VAR] = [FIELD_NAME_VAR] ;
答案 3 :(得分:2)
您可能会尝试传递此VALUE_VAR
1'' or ''''=''
如果它按原样使用并作为动态SQL执行,则应该导致
SELECT * FROM tab WHERE fieldname = '1' or ''=''