0

md5を使用してユーザーパスワードを取得しています。しかし、レコードを追加しようとすると、コードで「INSERTINTOステートメントの構文エラー」というエラーがスローされます。

これが私のコードです

    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

以下でこれを試してください。すべてのパラメーターが適切に囲まれ、エスケープされていることを確認してください。

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 に答える
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 に答える