2个字符长度变量是否会导致SQL注入漏洞?

2个字符长度变量是否会导致SQL注入漏洞?,sql,tsql,sql-server-2012,sql-injection,Sql,Tsql,Sql Server 2012,Sql Injection,我从用户处获取文本输入,然后将其转换为2字符长度字符串(2克) 比如说 RX480 "rx","x4","48","80" 现在,若我像下面这样直接查询服务器,它们能以某种方式进行SQL注入吗 select * from myTable where myVariable in ('rx', 'x4', '48', '80') SQL注入不是长度的问题 当有人向现有查询中添加代码时,就会发生这种情况。他们通过发送恶意的额外代码作为表单提交(或其他方式)来实现这一点。当您的SQL代码执行时,

我从用户处获取文本输入,然后将其转换为2字符长度字符串(2克)

比如说

RX480

"rx","x4","48","80"
现在,若我像下面这样直接查询服务器,它们能以某种方式进行SQL注入吗

select * 
from myTable 
where myVariable in ('rx', 'x4', '48', '80')

SQL注入不是长度的问题

当有人向现有查询中添加代码时,就会发生这种情况。他们通过发送恶意的额外代码作为表单提交(或其他方式)来实现这一点。当您的SQL代码执行时,它没有意识到要做的事情不止一件。它只是执行它所说的

您可以从以下简单查询开始:

select * 
from thisTable 
where something=$something
因此,您可能会得到如下查询:

select * 
from thisTable 
where something=; DROP TABLE employees;

这是一个奇怪的例子。但这或多或少说明了它的危险性。第一个查询将失败,但谁在乎呢?第二种方法确实有效。如果您有一个名为“employees”的表,那么您就不再有了。

在这种情况下,两个字符足以在查询中出错,并可能会显示有关它的一些信息。例如,试着使用string
”)480
并观察应用程序的行为。

虽然答案不多,但这确实不适合作为注释

代码扫描一个表,检查列值是否与用户提供的字符串中的任何一对连续字符匹配。用另一种方式表示:

declare @SearchString as VarChar(10) = 'Voot';
select Buffer, case
  when DataLength( Buffer ) != 2 then 0 -- NB: Len() right trims.
  when PatIndex( '%' + Buffer + '%', @SearchString ) != 0 then 1
  else 0 end as Match
  from ( values
    ( 'vo' ), ( 'go' ), ( 'n ' ), ( 'po' ), ( 'et' ), ( 'ry' ),
    ( 'oo' ) ) as Samples( Buffer );
在这种情况下,只需将
@SearchString
的值作为参数传递,就可以避免出现
In
子句中的
问题

或者,可以将字符对作为表参数传递,并与
中的
一起使用:
where Buffer IN(从@CharacterPairs中选择CharacterPair)

就SQL注入而言,将文本限制为字符对并不妨碍添加完整语句。正如其他人所指出的,它允许破坏查询并导致其失败。在我看来,这是一个问题


我仍在尝试为这种奇怪的模式匹配设想一个用例。它不会将长度(或长度)小于两个字符的列值与搜索字符串相匹配。

对于所有这些无数的问题,肯定应该有一个规范的答案:“如果我有[某种特殊类型的数据处理]我的查询是否仍然易受攻击?”问题

首先,你应该问问自己——为什么你想给自己买这样的放纵?原因是什么?为什么要在数据处理中添加异常?为什么要把你的数据分成羊和羊,告诉自己“这个数据是“安全的”,我不会正确处理它,而且数据是不安全的,我必须做些什么


甚至出现这样一个问题的唯一原因是您的应用程序体系结构。或者说,缺乏体系结构。因为只有在意大利面代码中,用户输入直接添加到查询中,这样一个问题才会出现。否则,您的数据库层应该能够处理任何类型的数据,这完全是错误的不包括其性质、来源或声称的“安全性”“

但是。。。在OP的例子中,他们接受用户输入并通过转换为2个字符长度的字符串对其进行半净化,因此他们将无法插入第二条语句,至少以任何有意义的方式。。。我可以说你是对的。我特别要求2克的转换输入。@JNevill:好的。。。我现在明白了。但是,当已经有措施来防止这些恶作剧的时候,这看起来不是有很多额外的麻烦要经历吗?同意。我建议,至少在2-gram的用户输入中转义单引号,或者根据需要,在转换为2-gram之前完全从用户输入中删除它们。但最糟糕的情况是(我相信)您最终会得到多个语句,所有语句都会因为出错或胡说八道而出错。我无法想象您最终会得到任何会导致服务器出现问题的sql注入,但是如果有人输入
,如果没有正确的转义/清除,您仍然可能会得到令人不快的结果和错误;foo
输入到您的表单中。@jnevil ty获取答案;foo会变成“';”,“f”,“fo”,“oo”。所以我想这是不可能的?您认为呢?您现在使用双引号,而不是像示例sql那样使用单引号。我在想,这将被转换为
select*from myTable,其中myVariable in(“”;’,’;f’,'fo','oo')
,这是三条语句。语句1:
select*from myTable,其中myVariable in(“”;
和语句2:
,“;
和语句3:
f','fo','oo')
都是无意义的。避免使用参数化查询似乎是一种非常缓慢而痛苦的方法。@JoelCoehoorn在
子句中参数化
很困难。每个集合成员必须有一个参数,因此通常必须动态生成它们。