【问题标题】:Issue with parameterized queries in a MySQL site searchMySQL 站点搜索中的参数化查询问题
【发布时间】:2013-09-24 07:01:25
【问题描述】:

我正在尝试使用 c# ASP.NET 和 MySQL 创建一个简单的站点搜索,并且我正在尝试使用参数化查询来防止 SQL 注入。那里已经有很多信息,但我仍然无法让它工作,任何人都可以看到我的代码有什么问题吗?有没有我没有引用的库?

这是我当前的代码:

using MySql.Data.MySqlClient;

string q = Request["q"].IsEmpty() ? "" : Request["q"];

List<dynamic> MyList = new List<dynamic>();

using(MySqlConnection con = new MySqlConnection("server=localhost;database=database;user id=user;password=password"))
{
    string sql = "SELECT * FROM Items WHERE Name = @Name";
    con.Open(); 

    MySqlCommand cmd = new MySqlCommand(sql,con);
    cmd.Parameters.AddWithValue("@Name", q);        

    MySqlDataReader reader = cmd.ExecuteReader(); 

    while(reader.Read()){ 
        MyList.Add(new {
            Value = reader["Value"].ToString()
        });

    con.Close();

}

如果我将 sql 参数换成数据库中的实际值,它确实会返回项目,如下所示:

    string sql = "SELECT * FROM Items WHERE Name = 'aValue'";

【问题讨论】:

  • 您是否收到任何错误,或者它只是不返回任何数据?
  • 嘿 Sam - 只是没有返回数据!
  • 调试并查看变量 q 有 'aValue'...
  • 是的,q 变量具有正确的预期值

标签: c# mysql asp.net sql sql-injection


【解决方案1】:
while(reader.Read()){ 
    MyList.Add(new {
        Value = reader["Value"].ToString()
    });

我认为上面的代码中可能有一些拼写错误 - 不确定这是否完全从您的源代码中复制而来 - 但您可能缺少一个结束 } for youe while 循环

另外,使用也是一个好习惯

  using(MySqlDataReader Reader = cmd.ExecuteReader()) 
  {
    ...
  }

就像你为 mySqlConnection 对象所做的那样来保存内存泄漏(但这不是你的问题。)

【讨论】:

    猜你喜欢
    • 2018-04-19
    • 2013-07-19
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多