gpt4 book ai didi

c# - 使用非参数化查询避免 SQL 注入(inject)

转载 作者:太空狗 更新时间:2023-10-30 00:39:27 26 4
gpt4 key购买 nike

我知道参数化查询是如何工作的,并且我在迄今为止编写的每个非硬编码查询中都使用了它们,但是当编写一个函数来创建动态查询(用于测试目的)时,它让我怀疑它是否真的会安全地“按原样”使用

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%' 

现在我仍然很确定由于缺少参数,这仍然容易受到注入(inject)攻击,但是我不确定由于分隔符是一个空格字符,所以像 SELECT * FROM TABLEDROP TABLE 不能写在字符串中,因为每个都会被拆分成自己的字符串,即。 SELECT*FROMTABLE

谁能进一步启发我?

(注意,不打算用它来代替适当的参数,只是想理解)

最佳答案

select"name"from"sys"."columns"

是我可以编写的查询示例,SQL Server 将处理该查询并且不包含空格。

所以,就说不吧。


这是另一个示例,显示另一种绕过“无空格”和“注入(inject)”形式的方法:

select name from sys.columns where name like '%a'union/**/all/**/select/**/name/**/from/**/sys.objects

关于c# - 使用非参数化查询避免 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35405048/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com