2014-04-30 2 views
1

내 애플리케이션을 실행할 때 SQL 인젝션을 당기고있는 것 같다. 누군가 나를 위해 빠른 픽스를 제안했다면, 모든 것을 바꾸지 않는 편이 좋다. 내 첫번째 프로젝트 업데이트.내 WinForm이 SQL 인젝션을 받고있다.

당신은 내 SQL 구문에 오류가 있습니다;

string constring = "datasource=127.0.0.1;port=3306;username=root;password=welcome"; 
     string Query = "insert into userdatabase.users (userid, email, passone, passtwo, lastname, firstname) values('" + this.userid_txt.Text + "','" + this.email_txt.Text + "','" + this.passone_txt.Text + "','" + this.passtwo_txt.Text + "','" + this.lastname_txt.Text + "','" + this.firstname_txt.Text + "') ;"; 
     MySqlConnection conDataBase = new MySqlConnection(constring); 
     MySqlCommand cmdDataBase = new MySqlCommand(Query, conDataBase); 
     MySqlDataReader myReader; 
     try 
      { 
       conDataBase.Open(); 
       myReader = cmdDataBase.ExecuteReader(); 
       MessageBox.Show("Welcome to iDSTEM!"); 
       while (myReader.Read()) 
      { 

       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 

오류가 있음을 언급 예컨대, 당신이 매개 변수를 사용해야합니다 주입을 방지하기 위해 중위

+2

예, 그 코드에 취약 : 우리가 상상 경우 MySQL은 다음 매개 변수 이름의 @ 접두사를 사용하여 명명 된 매개 변수를 지원하는지 나는 MySQL을 사용하지 않는, 그래서 내가 확실히 말할 수는 없지만, SQL 삽입 (아포스트로피와 관련된 좋은 구식 실패). 그래서 고쳐주세요. 질문은 무엇입니까? –

+0

이 코드의 어느 부분에서 SQL 주입을 일으키는 지 알아 보려면 결과에 영향을 미치지 않는 단일 '표시와 관련이 있습니다. – Bendlino

+0

http://stackoverflow.com/a/3216248/2186023 – DrCopyPaste

답변

3

라인 1에서 "사용자 데이터베이스"근처의 구문을 확인 ... 설명서를 확인하십시오

string constring = "datasource=127.0.0.1;port=3306;username=root;password=welcome"; 
string Query = "insert into userdatabase.users (userid, email, passone, passtwo, lastname, firstname) values(@par1,@par2,@par3,@par4,par5,@par6)"; 

    MySqlConnection conDataBase = new MySqlConnection(constring); 
    MySqlCommand cmd = new MySqlCommand(Query, conDataBase); 
    cmd.Parameters.AddWithValue("@par1",this.userid_txt.Text) 
    cmd.Parameters.AddWithValue("@par2",this.email_txt.Text) 
    cmd.Parameters.AddWithValue("@par3",this.passone_txt.Text) 
    cmd.Parameters.AddWithValue("@par4",this.passtwo_txt.Text) 
    cmd.Parameters.AddWithValue("@par5",this.lastname_txt.Text) 
    cmd.Parameters.AddWithValue("@par6",this.firstname_txt.Text) 

    try 
     { 
      conDataBase.Open(); 
      //Execute command 
      cmd.ExecuteNonQuery(); ///I suppose no need to use datareader...since you make insert 
      MessageBox.Show("Welcome to iDSTEM!"); 

    catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
+0

고마워, 타이핑 해 줘. 나는 또한 매개 변수를 포함하기 위해 SQL 문 자체를 수정하는 방법을 OP를 보여주는 것이 좋습니다. – Liath

+0

6을 곱하면 "더럽다"와 같은 도구가 보이기 시작합니다. ** 실제로 ** 맛있어졌습니다! –

+0

제안을 시도해 주셔서 감사합니다. – Bendlino

1

여기에서의 "수정"매개 변수입니다. 지름길 : 데이터베이스 제공자가 명명 된 매개 변수를 지원하면, dapper가 도움이 될 수 있습니다.

// uses "dapper" (search for "Dapper" on NuGet/Package Manager) 
connection.Execute(
@"insert into userdatabase.users 
     (userid, email, passone, passtwo, lastname, firstname) 
values(@userid, @email, @passone, @passtwo, @lastname, @firstname)", 
    new { userid = this.userid_txt.Text, 
      email = this.email_txt.Text, 
      passone = this.passone_txt.Text, 
      passtwo = this.passtwo_txt.Text, 
      lastname = this.lastname_txt.Text, 
      firstname = this.firstname_txt.Text}); 
+0

전에 그 접근법을 보지 못했습니다 - 멋지 네요! – Liath

+0

마크, 내가 할 수 없었던 유일한 점은 연결이 '현재 컨텍스트에 존재하지 않습니다'라는 것입니다.이 연결을 어딘가에 불러야합니까? – Bendlino

+0

@ user3581876 당신은 이미 연결을 가지고 있습니다 - 그것은'conDataBase'라고 불립니다. 'Execute' 메쏘드는 "dapper" –

관련 문제