我知道参数化查询的工作原理,并且在我到目前为止编写的每个非硬编码查询中都使用了它们,但是在编写一个函数来创建动态查询(出于测试目的)时,我质疑它是否真的可以安全使用按原样使用
string sql = "SELECT * FROM Table WHERE";
string fullstring = "The quick brown fox jumped over";
string[] words = fullstring.Split(' ');
foreach (string item in words)
{
sql = sql + " Column LIKE '%" + item + "%' AND";
}
sql = sql.Remove(sql.Length - 3);
如果我将其转换为查询,结果将是
SELECT * FROM Table WHERE Column LIKE '%the%' AND Column LIKE '%quick%' AND Column LIKE '%brown%' AND Column LIKE '%fox%' AND Column LIKE '%jumped%' AND Column LIKE '%over%'
现在我仍然很确定由于缺少参数,这仍然容易受到注入攻击的影响,但是我不确定由于分隔符是一个空格字符,使得像每个字符一样SELECT * FROM TABLE
或DROP TABLE
无法写入字符串的原因被分成自己的字符串,即。SELECT
,*
,FROM
和TABLE
谁能进一步启发我?
(请注意,不打算将其用作适当参数的替代方法,只是试图理解)
select"name"from"sys"."columns"
我可以编写一个查询示例,该示例可以写为SQL Server将处理并且不包含空格。
所以,就说不。
这是另一个示例,它以“注入”形式显示了另一种绕过“无空格”的方式:
select name from sys.columns where name like '%a'union/**/all/**/select/**/name/**/from/**/sys.objects
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句