【问题标题】:Protect my app from SQL Injection [duplicate]保护我的应用免受 SQL 注入 [重复]
【发布时间】:2018-03-08 09:21:23
【问题描述】:

现在我在数据库中执行搜索并使用

显示结果
string keyWord = textBoxSearch.Text.ToString();
using (SqlConnection con = new SqlConnection(conString))
{
    try
    {
        con.Open();
        if (con.State == ConnectionState.Open)
        {
            using (SqlCommand cmd = new SqlCommand("SELECT articleCode, articleName FROM Article WHERE articleName LIKE '" + keyWord + "%'", con))
            {
                // Put search result in dataGrid
            }
        }
    }
}

现在按照SqlCommand.Parameters 的例子我应该做类似的事情

string cmdQuery = "SELECT articleCode, articleName from Article WHERE articleName LIKE @articleName'";
using (SqlConnection con = new SqlConnection(conString))
{
    using (SqlCommand cmd = new SqlCommand(cmdQuery, con))
    {
        cmd.Parameters.Add("@articleName", SqlDbType.NVarChar);
        cmd.Parameters["@articleName"].Value = textBoxSearch.Text;
        try
        {
            // Put search result in dataGrid
        }
    }
}

但我真的看不出这有什么不同,因为我仍然必须使用原始 textBoxSearch.Text 值。 我这样做对吗?

【问题讨论】:

  • 嗨,看看这个(类似的)问题:stackoverflow.com/questions/7174792/…
  • “但我真的看不出这有什么不同” 那么您还应该阅读文本,而不仅仅是 c&p 示例代码... ;D
  • 但是说真的:我认为您的参数名称与查询中的参数不匹配。它应该,虽然 AFAIK
  • @Fildor 我在帖子中更改了一些名称,因为它们中的大多数都不是英文的。看起来我错过了一些。

标签: c# sql winforms sql-injection


【解决方案1】:

要保护网站免受 SQL 注入,您可以使用 SQL 参数。 SQL 参数是在执行时以受控方式添加到 SQL 查询的值。

例子:

txtUserId = getRequestString("UserId");
sql = "SELECT * FROM Customers WHERE CustomerId = @0";
command = new SqlCommand(sql);
command.Parameters.AddWithValue("@0",txtUserID);
command.ExecuteReader();

SQL 引擎会检查每个参数以确保它对于其列是正确的,并且按字面意思处理,而不是作为要执行的 SQL 的一部分。

查看this了解更多详情。

是的,您仍然可以使用文本框来获取值。

【讨论】:

  • DV 比我评论的要快。仅链接的答案在 SO 上是不受欢迎的。链接可能会死。可以包含链接作为参考,但将相关部分粘贴到您的答案中,这样即使链接失效,它仍然有用。
  • 这应该是评论,而不是答案。
  • @Fildor:更新答案以添加参考中的详细信息
猜你喜欢
  • 2021-10-23
  • 2013-02-19
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 2012-10-24
  • 2010-12-24
相关资源
最近更新 更多