首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF/SQL:用参数替换值?

WPF/SQL:用参数替换值?
EN

Stack Overflow用户
提问于 2018-10-23 12:40:31
回答 2查看 623关注 0票数 0

我是C#新手,我编写了以下代码。在阅读了文档之后,我意识到我的代码应该容易受到SQL注入的影响,因为我没有为我的值使用参数(据我所知,您可以通过search.Text插入不必要的查询)。我是否应该担心它,因为我实际上是把我的值锁定在"“引号内?

我在这里找到了一些方向,但我无法让它开始工作:如何在sql语句中使用字符串变量

代码语言:javascript
复制
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不起作用

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

票数 3
EN

Stack Overflow用户

发布于 2018-10-23 12:58:00

简单地说,是的,你总是需要担心SQL注入,你不会相信一些黑客会有多有创意。

虽然我在C#方面很有经验,但我从来没有在C#中使用过直接SQL,但我总是在数据库中使用EF和LINQ。

不管怎么说,这里:

代码语言:javascript
复制
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数据库第一教程

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52949350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档