【问题标题】:MySQL C# validation error [closed]MySQL C# 验证错误 [关闭]
【发布时间】:2012-10-31 06:40:15
【问题描述】:
public void Find(string userName, string password)
    {
        string query = "SELECT COUNT(*) FROM user WHERE username =\'" + userName + "\', \'" + GetMd5Sum(password) + "\'";
        MySqlCommand cmd = new MySqlCommand(query, connection);

        try
        {

            //This will return 1 if the username and password exist.
            //It will return 0 if the username and password are not found.
            int count = (int)cmd.ExecuteScalar();

            if (count > 0)
                MessageBox.Show("You have succesfully logged in!");
            else
                MessageBox.Show("Incorrect username or password.");

            connection.Close();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message.ToString());
        }
    }

我认为这就是问题所在。谁能解释或帮助我解决这个错误?

错误是:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“C8059E2Ec7419F590E79D7F1B774BFE6”附近使用正确的语法

【问题讨论】:

  • 尝试将userName = "' OR 1=1 --"; 行放在方法的顶部。然后,如果您不明白为什么“解决”了您的问题,请阅读 SQL 注入攻击。

标签: c# mysql validation passwords


【解决方案1】:

您的 SQL 如下所示(当然,$user$passwordhash 是值):

SELECT COUNT(*) FROM user WHERE username = '$user', '$passwordhash'

您希望第二个值做什么?我怀疑你想要这样的东西:

SELECT COUNT(*) FROM user WHERE username = '$user' AND passhash = '$passwordhash'

(根据您的实际列名更改passhash。)

但是,您应该只将该文本添加到您的查询中。相反,请更改您的代码以使用参数化 SQL 以避免 SQL 注入攻击。 总是使用参数而不是直接在 SQL 中包含值:

  • 避免 SQL 注入攻击
  • 它避免了不必要且容易出错的字符串转换(尤其是日期/时间值)
  • 它将您的代码 (SQL) 与数据分开,使查询更易于阅读

【讨论】:

    【解决方案2】:

    您需要在 where 子句中的值之间使用 AND

    string query = "SELECT COUNT(*) FROM user " + 
                   "WHERE username ='" + userName + "' AND " +
                   "PASSWORD ='" + GetMd5Sum(password) + "'";
    

    而且你没有命名你的密码列。

    【讨论】:

    • 您仍然没有纠正巨大的 SQL 注入攻击向量。我真的希望 OP 不会采取只是应用你的答案的简单但最终可怕的方法。
    • 我不会。我知道参数,我只是想看看我是否可以先让它工作。
    • @user1816388:不要那样做。首先,带有参数的代码更清晰...其次,您很有可能永远找不到时间回去正确地执行它。我们都将 TODO 留在了代码库中 - 从不在涉及 SQL 注入的地方这样做。
    • 好吧,那我现在用参数来做。
    • 您能否发布一个示例,说明我如何使用参数执行此操作?执行标量对我不起作用,即使它应该返回一个整数,但当我转换它时,它会给我一个关于指定转换类型的错误。
    【解决方案3】:

    您的查询将如下所示:

    SELECT COUNT(*) FROM user WHERE username ='user', 'pass'
    

    本来应该是这样的:

    SELECT COUNT(*) FROM user WHERE username ='user' AND password='pass'
    

    稍作研究和回顾会有所帮助。

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 2014-03-08
      • 1970-01-01
      • 2016-07-18
      相关资源
      最近更新 更多