0

我正在使用 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();
   }
4

2 回答 2

0

你有更高层次的问题。您永远不应该通过连接语句和值来创建 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 参数

于 2011-11-13T14:47:46.690 回答
0

在下面试试这个,它确保所有参数都被正确地封闭和转义。

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
}
于 2011-11-13T15:01:19.400 回答