2011-11-13 1 views
0

사용자 암호를 ecnrypt하기 위해 md5를 사용하고 있습니다. 그러나 모든 레코드를 추가하려고 할 때마다 내 코드에서 "INSERT INTO 문에 구문 오류가 있습니다."라는 오류가 발생합니다.ecrypted 문자열을 사용할 때 SQL 삽입 메서드가 실패합니다.

여기에 당신은 높은 수준의 문제가 내 코드

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

답변

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

+0

MD5를 쿼리 차단기 *로 가리키지 않습니다. MD5는 숫자와 문자 ('[0-9a-fA-F]')로 구성되며 아포스트로피로 묶습니다. –

+0

예, 이해합니다. 그러나 쿼리가 어떻게 든 부러졌으며 이해해야한다는 것을 이해해야합니다. 연결하는 동안 끊어집니다. iincorrect first name, last name 및 username은 쉽게 깨질 수 있습니다. 뿐만 아니라 SQL 주입을 구현합니다. –

+0

MD5 주석에 동의하고이를 다시 썼습니다. 나는 현재 코드에서 MD5가 특히 s.Append (b.ToString ("x2"). ToLower()) 이후에 아무 것도 해독하지 못한다고 상상할 수 없다. –

관련 문제