Метод вставки sql завершается неудачно при использовании зашифрованной строки - PullRequest
0 голосов
/ 13 ноября 2011

Я использую md5 для расшифровки пароля пользователя.Но всякий раз, когда я пытаюсь добавить какие-либо записи, мой код выдает ошибку «Синтаксическая ошибка в инструкции INSERT INTO».

Вот мой код

    public int InsertUser(string lastName, string firstName, string username, string password, bool isAdmin)
    {
        OleDbConnection conn = new OleDbConnection(connStr);
        conn.Open();

        string encryptPassword = encryptMD5(username,password).ToString();
        OleDbCommand  dCmd = new OleDbCommand("INSERT INTO Users (LastName, FirstName, UserName, Password) " +
                                            "VALUES ('" + lastName + "','" + firstName + "','" + username + "','" + encryptPassword + "')", conn);

        dCmd.CommandType = CommandType.Text;
        try
        {
            return dCmd.ExecuteNonQuery();
        }
        catch
        {
            throw;
        }
        finally
        {
            dCmd.Dispose();
            conn.Close();
            conn.Dispose();
        }
    }

    private string encryptMD5(string username, string sPassword)
    {
        System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
        byte[] bs = System.Text.Encoding.UTF8.GetBytes(sPassword + username);
        bs = x.ComputeHash(bs);
        System.Text.StringBuilder s = new System.Text.StringBuilder();
        foreach (byte b in bs)
        {
            s.Append(b.ToString("x2").ToLower());
        }
        return s.ToString();
   }

Ответы [ 2 ]

0 голосов
/ 13 ноября 2011

Попробуйте это ниже, это гарантирует, что все параметры правильно заключены и экранированы.

try
{
    using (OleDbConnection conn = new OleDbConnection(connStr))
    {
        conn.Open();

        string encryptPassword = encryptMD5(username, password).ToString();

        using (OleDbCommand dCmd = new OleDbCommand(
            "INSERT INTO Users (LastName, FirstName, UserName, Password) " +
            "VALUES (?, ?, ?, ?)", conn))
        {
            dCmd.CommandType = CommandType.Text;

            OleDbParameter p;

            dCmd.Parameters.Add(p = new OleDbParameter("@lastName", OleDbType.VarChar));
            p.Value = lastName;

            dCmd.Parameters.Add(p = new OleDbParameter("@firstName", OleDbType.VarChar));
            p.Value = firstName;

            dCmd.Parameters.Add(p = new OleDbParameter("@username", OleDbType.VarChar));
            p.Value = username;

            dCmd.Parameters.Add(p = new OleDbParameter("@encryptPassword", OleDbType.VarChar));
            p.Value = encryptMD5(username, password);

            return dCmd.ExecuteNonQuery();
        }
    }
}
catch
{
    throw; // here should be better exception handling
}
0 голосов
/ 13 ноября 2011

У вас проблема более высокого уровня.Вы должны никогда создавать оператор SQL путем объединения операторов и значений.Вы должны связать значения как параметры, тогда базовая структура будет обрабатывать параметры и даже предоставлять их отдельно от оператора SQL серверу.Это гораздо более безопасный способ (внедрение SQL не возможно), с лучшей производительностью, и вы не попадете в ошибки такого типа.

Если вы хотите понять причину проблемы, то вам следует изучитьфактический оператор вставки, который вы создаете, и проблема станет очевидной

    "INSERT INTO Users (LastName, FirstName, UserName, Password) " + "VALUES ('" + lastName + "','" + firstName + "','" + username + "','" + encryptPassword + "')"

Вполне вероятно, что результат вашего хэша MD5 или других параметров каким-то образом нарушит синтаксис SQL INSERT.(в большинстве случаев не следует указывать фактические значения). Вы должны попытаться выполнить результирующий запрос к фактической базе данных, чтобы увидеть фактическую ошибку в возвратах (например, используйте SQL Server Management Studio)

Для привязки параметров вы должны использовать что-то вроде этого:

    dCmd.Parameters.Add(new OleDbParameter("@username",username)); 

См. Справочник MSDN: Параметры OleDbCommand

...