2013-08-24 2 views
0

MyI는 데이터에서 정보를 수집해야하는 양식을 작성했습니다. 이 데이터는 "등등을 포함하여 임의의 문자가 포함될 수 있습니다. 내 질문에 어떻게 SQL 삽입 공격을하지 않고 데이터를 안전하게 삽입 할 수 있습니다."/ "와 같은 문자가있을 때마다이 양식에서 오류가 발생하지 않도록 이스케이프 문자를 삽입 할 수있는 위치 등등이 삽입됩니다. SQL 인젝션 보호를 위해SQL 테이블에 데이터를 안전하게 삽입하고 SQL 삽입 오류를 방지하십시오.

public string InsertRecordSet() 
    {   

     source = new FileInfo(@"c:\scripts\db_connection.txt"); 
     stream = source.OpenText(); 
     String text = stream.ReadLine(); 
     stream.Close(); 
     String uid = text.Substring(0, text.IndexOf(":")); 
     String pw = text.Substring(text.IndexOf(":") + 1, (text.Length - uid.Length - 1)); 
     String connectionString = "dsn=" + "db" + "; uid=" + uid + "; pwd=" + pw + ";"; 
     String statement = "INSERT INTO table (SubmitDate, FirstName, LastName, Email, Phone, Major, Description, HearAbout) VALUES (@SubmitDate, @FirstName, @LastName, @Email, @Phone, @Major, @Description, @HearAbout)";      

     conn = new OdbcConnection(connectionString); 

     command = new OdbcCommand(statement, conn); 

     command.Parameters.AddWithValue("@SubmitDate", DateTime.Now); 
     command.Parameters.AddWithValue("@FirstName", txtFname.Text); 
     command.Parameters.AddWithValue("@LastName", txtLname.Text); 
     command.Parameters.AddWithValue("@Email", txtEmail.Text); 
     command.Parameters.AddWithValue("@Phone", txtPhone.Text); 
     command.Parameters.AddWithValue("@Major", txtMajor.Text); 
     command.Parameters.AddWithValue("@Desciption", txtDescription.Text); 
     command.Parameters.AddWithValue("@HearAbout", txtMaxwell.Text); 

     conn.Open(); 
     try 
     {    
      command.ExecuteNonQuery(); 
      return "true"; 
     } 
     catch (OdbcException oe) 
     { 
      _dbError = true; 
      Session.Contents.Add("USIFormException", oe); 
      return (oe.ToString()); 
     } 
     finally 
     { 
      conn.Close(); 
     } 
    } 

답변

1

, 인라인 SQL을 사용하지만, 대신 매개 변수화 된 SQL을 사용하지 마십시오

여기에 지금까지 내 코드입니다. 그것은 단지 값 (또는 매개 변수) 문자열의 일부가 될 수 있기 때문에

매개 변수화 된 SQL 대신 아무것도, SQL 주입을 방지 할 수 있습니다. 예를 들어 Command 개체는 합법적 인 매개 변수 값이 아니므로 매개 변수화 된 SQL 문자열에 DROP TABLE xyz을 가질 수 없습니다. 그래서 그 대신이 코드의

:

String statement = String statement = "INSERT INTO MyTable(SubmitDate, FirstName, LastName, Email, Phone, Major, Description, HearAbout) VALUES (@SubmitDate, @FirstName)"; 

command.Parameters.Add("@SubmitDate", DateTime.Now.ToShortDateString()); 
command.Parameters.Add("@FirstName", txtFname.Text); 

참고 :

String statement = "INSERT INTO MyTable(SubmitDate, FirstName, LastName, Email, Phone, Major, Description, HearAbout)";      
statement += "VALUES ("; 
statement += "'" + DateTime.Now.ToShortDateString() + "',"; 
statement += "'" + txtFname.Text + "', "; 

conn = new OdbcConnection(connectionString); 

command = new OdbcCommand(statement, conn); 

당신은 같은 코드가 있어야는 매개 변수화 된 쿼리는 완전히 SQL 주입으로부터 보호되지 않습니다 데이터베이스 로직은 동적 일 경우 SQL이므로 그렇게하지 마십시오.

+0

음을 그 사용자는 "추천"등이 데이터베이스 오류 발생에 대한 값을 입력 할 때마다. 어떤 아이디어 이스케이프 문자를 추가하는 방법 또는 오류가 발생하지 않도록하려면 – Paradigm

+0

내가 그 일을했을 때 어떤 이유로이 오류가 발생합니다. 오류 [42000] [Microsoft] [ODBC SQL Server 드라이버] [SQL Server] 변수를 선언해야합니다. '@SubmitDate'. – Paradigm

+0

명령 개체가 구문 분석하지 않습니다. 무효 SQL에 대한 내용. 매개 변수는 개별적으로 전달되므로 SQL & '을 포함 할 수 있지만 분석되지 않으므로 문제가되지 않습니다. –

0

매개 변수화 된 값을 사용해야합니다. 랜덤 주입 문제 이제 다른 문제를 해결

string query = "INSERT INTO MyTable(SubmitDate, FirstName, LastName, Email, Phone, Major, Description, HearAbout)";      
query += " VALUES (@SubmitDate, @FirstName, @LastName, @EMail, @Phone, @Major, @Description, @HearAbout)"; 
conn = new OdbcConnection(connectionString); 
command = new OdbcCommand(query, conn); 
command.Parameters.AddWithValue("@SubmitDate", DateTime.Now.ToShortDateString()); 
command.Parameters.AddWithValue("@FirstName", txtFname.Tex); 
... 

conn.Open(); 
command.ExecuteNonQuery(); 

http://msdn.microsoft.com/en-us/library/system.data.odbc.odbccommand.aspx

http://msdn.microsoft.com/en-us/library/system.data.odbc.odbcparametercollection.aspx

+1

글쎄, 임의의 주입 문제, 지금 다른 문제를 해결했습니다. 사용자가 ''와 같은 값을 입력 할 때마다 데이터베이스 오류가 발생합니다. 이스케이프 문자를 추가하는 방법이나 오류가 발생하지 않는 방법에 대한 아이디어가 있습니까? – Paradigm

+0

내가 그 일을 할 때 어떤 이유로이 오류가 발생합니다. : ERROR [42000] [Microsoft] [ODBC SQL Server 드라이버] [SQL 서버] 변수를 선언해야 '@SubmitDate' – Paradigm

+0

당신은 위의'VALUES의 코드와 같이 너무 당신의 SQL 쿼리에 변수를 추가해야합니다 (. @SumbitDate, @FirstName, ...) ' – Tseng

관련 문제