如果提交的凭据错误,程序将引发错误

本文关键字:错误 程序 如果 提交 | 更新日期: 2023-09-27 18:36:45

关于安全性,这是一个肮脏的原型,因此密码没有哈希盐。

我正在测试一些 c# MySQL 代码,当正确的凭据发送到数据库时,程序返回值 1,这意味着正确。

但是,如果检查的值与结果不匹配,我会得到异常:

服务器中发生类型为"System.FormatException"的未处理异常.exe 其他信息:输入字符串格式不正确。

    public int CheckLoginCredentials(String username,string password)
    {
        string query = "SELECT * from testTable.user WHERE username='" + username + "' and password='" + password + "'";
        int Count = -1;
        //Open Connection
        if (this.OpenConnection() == true)
        {
            //Create Mysql Command
            MySqlCommand cmd = new MySqlCommand(query, connection);
            //ExecuteScalar will return one value
            try
            {
                Count = int.Parse(cmd.ExecuteScalar() + "");
            }
            catch (Exception e)
            {
                throw e;
            }
            //close Connection
            this.CloseConnection();
            return Count;
        }
        else
        {
            return Count;
        }
    }

我试图抛出异常,但它使服务器崩溃。如何优雅地解决问题?

如果提交的凭据错误,程序将引发错误

在这种情况下,您必须在此处使用SELECT Count(*);

ExecuteScalar将执行查询,并返回第一列 查询返回的结果集中的第一行。附加 将忽略列或行。

还有一个常见的建议;使用参数化查询来避免 SqlInjection;所以命令定义将如下所示:

        string query = "SELECT COUNT(*) from testTable.user WHERE username=@username and password=@password";
        MySqlCommand cmd = new MySqlCommand(query, connection);
        cmd.Parameters.AddWithValue("@username", username);
        cmd.Parameters.AddWithValue("@password", password);

现在,命令已准备好执行。正如 MSDN 建议的那样ExecuteScalar()将返回我们需要转换为整数的object,但在这种情况下,count()将始终返回一个整数值(如果结果为 null,则0),因此cmd.ExecuteScalar()的输出将是一个boxed integer。因此,查询执行将如下所示:

   int Count = Convert.ToInt32(cmd.ExecuteScalar());