我是C#新手,我编写了以下代码。在阅读了文档之后,我意识到我的代码应该容易受到SQL注入的影响,因为我没有为我的值使用参数(据我所知,您可以通过search.Text插入不必要的查询)。我是否应该担心它,因为我实际上是把我的值锁定在"“引号内?
我在这里找到了一些方向,但我无法让它开始工作:如何在sql语句中使用字符串变量
public void InvokeDataGridAddress()
{
switch (ComboBoxSelection.Text)
{
case "NASLOV":
comboBoxValue = "SELECT * FROM [cbu_naslovi] WHERE [ADDRESS] LIKE '%" + search.Text + "%' COLLATE Latin1_general_CI_AI";
break;
case "LASTNIK":
comboBoxValue = "SELECT [cbu_naslovi].* FROM [cbu_deli], [cbu_naslovi] WHERE [cbu_deli].LASTNIK LIKE '%" + search.Text + "%' COLLATE Latin1_general_CI_AI AND [cbu_deli].IDX = [cbu_naslovi].ID";
break;
case "OBJEKT":
comboBoxValue = "SELECT * FROM [cbu_naslovi] WHERE [SO] LIKE '%" + search.Text + "%'";
break;
case "PARCELA":
comboBoxValue = "SELECT * FROM [cbu_naslovi] WHERE [P1] LIKE '%" + search.Text + "%' OR [P2] LIKE '%" + search.Text + "%' OR [P3] LIKE '%" + search.Text + "%' OR [P4] LIKE '%" + search.Text + "%' OR [P5] LIKE '%" + search.Text + "%' OR [P6] LIKE '%" + search.Text + "%' OR [P7] LIKE '%" + search.Text + "%' OR [P8] LIKE '%" + search.Text + "%' OR [P9] LIKE '%" + search.Text + "%' OR [P10] LIKE '%" + search.Text + "%' OR [P11] LIKE '%" + search.Text + "%' OR [P12] LIKE '%" + search.Text + "%' OR [P13] LIKE '%" + search.Text + "%' OR [P14] LIKE '%" + search.Text + "%' OR [P15] LIKE '%" + search.Text + "%' OR [P16] LIKE '%" + search.Text + "%' OR [P17] LIKE '%" + search.Text + "%'";
break;
}
comboBoxValue = comboBoxValue + " ORDER BY [ULICA] ASC, [OBMOCJE] ASC, LEN ([HS]) ASC, [HS] ASC, [HID] ASC";
SqlCommand cmd = new SqlCommand
{
CommandText = comboBoxValue,
Connection = con
};
Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
SqlDataAdapter da = new SqlDataAdapter(cmd);
dtAddress.Clear();
da.Fill(dtAddress);
dg_address.ItemsSource = dtAddress.DefaultView;
Mouse.OverrideCursor = System.Windows.Input.Cursors.Arrow;
}编辑:由Olivier和MindSwipe提供的工作解决方案。我还将留下一个关于如何使用%参数进行类似工作的参考:在类似SQL子句中使用SqlParameter不起作用
public void InvokeDataGridAddress()
{
switch (ComboBoxSelection.Text)
{
case "NASLOV":
comboBoxValue = "SELECT * FROM [cbu_naslovi] WHERE [ADDRESS] LIKE @SearchText COLLATE Latin1_general_CI_AI";
break;
case "LASTNIK":
comboBoxValue = "SELECT [cbu_naslovi].* FROM [cbu_deli], [cbu_naslovi] WHERE [cbu_deli].LASTNIK LIKE @SearchText COLLATE Latin1_general_CI_AI AND [cbu_deli].IDX = [cbu_naslovi].ID";
break;
case "OBJEKT":
comboBoxValue = "SELECT * FROM [cbu_naslovi] WHERE [SO] LIKE @SearchText";
break;
case "PARCELA":
comboBoxValue = "SELECT * FROM [cbu_naslovi] WHERE [P1] LIKE @SearchText OR [P2] LIKE @SearchText OR [P3] LIKE @SearchText OR [P4] LIKE @SearchText OR [P5] LIKE @SearchText OR [P6] LIKE @SearchText OR [P7] LIKE @SearchText OR [P8] LIKE @SearchText OR [P9] LIKE @SearchText OR [P10] LIKE @SearchText OR [P11] LIKE @SearchText OR [P12] LIKE @SearchText OR [P13] LIKE @SearchText OR [P14] LIKE @SearchText OR [P15] LIKE @SearchText OR [P16] LIKE @SearchText OR [P17] LIKE @SearchText";
break;
}
comboBoxValue = comboBoxValue + " ORDER BY [ULICA] ASC, [OBMOCJE] ASC, LEN ([HS]) ASC, [HS] ASC, [HID] ASC";
SqlCommand cmd = new SqlCommand
{
CommandText = comboBoxValue,
Connection = con
};
cmd.Parameters.AddWithValue("@SearchText", '%' + search.Text + '%');
Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
SqlDataAdapter da = new SqlDataAdapter(cmd);
dtAddress.Clear();
da.Fill(dtAddress);
dg_address.ItemsSource = dtAddress.DefaultView;
Mouse.OverrideCursor = System.Windows.Input.Cursors.Arrow;
}发布于 2018-10-23 12:53:42
您容易受到SQL注入的影响。
首先,最好像下面这样列举您的选择中想要的内容:
SELECT Name, Address, City FROM [YourTable]而不是SELECT * FROM [YourTable]
其次,您应该在查询中插入参数,如下所示:
SELECT Name, Address, City FROM [YourTable] WHERE Name = @Name
听从你的命令:
cmd.Parameters.AddWithValue("@Name", YourValue)
希望能帮上忙
以下是一些链接:防止SQL注入的好方法是什么? https://www.codeproject.com/Tips/706692/Preventing-SQL-Injection-Attacks
发布于 2018-10-23 12:58:00
简单地说,是的,你总是需要担心SQL注入,你不会相信一些黑客会有多有创意。
虽然我在C#方面很有经验,但我从来没有在C#中使用过直接SQL,但我总是在数据库中使用EF和LINQ。
不管怎么说,这里:
using (var con = new SqlClient.SqlConnection(conectionString))
using (var cmd = SqlClient.SqlCommand())
{
con.Open();
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT * FROM [cbu_naslovi] WHERE [ADDRESS] LIKE '%@Title%' COLLATE Latin1_general_CI_AI";
cmd.Parameters.Add("@Title", search.Text);
}一些解释:
使用:使用关键字非常简单。基本上,在圆括号(例如Class c = new Class();)之间插入的任何东西都需要实现IDisposable,这个变量在Curly之后就会被释放。
Syntatic Candy:通常需要用大括号{ }来跟踪using(),除非它是一个语句或另一个使用语句的语句
Sql内容: con.Open打开到数据库的连接,并将其设置为命令将与cmd.Connection = con使用的连接。
现在,,我们需要说明它是什么类型的命令。通过执行cmd.CommandType = CommandType.Text,我们告诉命令它是一个SQL查询。
,现在是,我们需要实际定义查询,但我们使用@SomeName作为占位符,而不是将字符串与+连接起来。
,最后是,我们用实际值替换@SomeName,方法是执行cmd.Parameters.Add("@SomeName", value),其中@SomeName可以是任何东西,但它需要与我们希望在SQL查询中替换的占位符相同。
这就是我们实际上保护自己免受SQL注入攻击的地方,因为cmd.Parameters.Add()完成了我们需要做的所有事情,否则就需要手动执行。
希望这能帮上忙,不要再把你搞糊涂了
注:如果您对实体框架(EF)或LINQ感兴趣,这里有一个很好的来源:EF数据库第一教程
https://stackoverflow.com/questions/52949350
复制相似问题