【问题标题】:If the wrong credentials are submitted, program throws error如果提交了错误的凭据,程序会抛出错误
【发布时间】:2016-06-13 09:23:42
【问题描述】:

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

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

但是,如果检查的值与结果不匹配,则会出现异常:

Server.exe 中出现“System.FormatException”类型的未处理异常 附加信息:输入字符串的格式不正确。

    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;
        }
    }

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

【问题讨论】:

    标签: c# mysql exception


    【解决方案1】:

    在这种情况下,您必须在此处使用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() 将始终返回一个整数值(如果结果为空,0),因此输出cmd.ExecuteScalar() 将是 boxed integer。所以查询执行如下:

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

    【讨论】:

    • 另外,将代码更改为:Count = (Int32) cmd.ExecuteScalar();
    • 你不需要 ToString() 然后解析字符串..这是浪费的工作。结果已经是一个装箱的整数,您只需像上面一样转换为 int :)
    • @un-lucky 很好的答案。参数化查询对我来说是双赢,从来不知道。我希望我能加倍投票给你。像字符一样工作。
    猜你喜欢
    • 1970-01-01
    • 2018-09-24
    • 2020-10-31
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 2020-11-11
    相关资源
    最近更新 更多