2011-03-15 5 views
10

나는 SQL 인젝션에 대해 조금 읽었고 내 코드가 "안전하다"라고 말하고 싶다. 사용자 입력을 검사하기 위해 RegExp 유효성 검사기를 사용할 계획 이었지만 여기서 매개 변수화 된 쿼리 만 사용하여 제안했다. 잘 사용하고 있지만 코드가 안전한지 확인하고 싶습니다. 그렇습니까? SQL 인젝션으로부터 안전한 매개 변수로 DB에 삽입?

 using (SqlConnection dataConnection = new SqlConnection(myConnectionString)) 
     { 
      using (SqlCommand dataCommand = dataConnection.CreateCommand()) 
      { 
       dataCommand.CommandText = "INSERT INTO Lines (Name, CreationTime) " + 
        "VALUES (@LineName, @CurrentDateTime)"; 

       dataCommand.Parameters.AddWithValue("@LineName", TextBox2.Text); 
       dataCommand.Parameters.AddWithValue("@CurrentDateTime", DateTime.Now.ToString()); 
       dataConnection.Open(); 
       //do other DB stuff 

나는 마지막 부분은, 나머지 그냥 시도하고 예외를 잡기 DB 연결을 닫는뿐만 아니라 성공적인 삽입에 대한 사용자 피드백을 제공 포스트 짧은을 만들기 위해 들어온다.

+0

은'CreationTime' 열 유형 인 경우'DateTime', 당신은'로 .toString()'캐스트가 필요하지 않습니다. – Cosmin

답변

11

값이 문자열 리터럴이 아닌 매개 변수로 전달되므로 코드가 올바로 주입되지 않도록 보호됩니다. 그러나 이러한 유형의 데이터 액세스를 직접 작성하는 경우 SqlParameter 개체를 만들고 유형, 크기 등을 명시 적으로 설정하고 명령에 매개 변수를 추가하는 것을 고려 했습니까? AddWithValue는 정상적으로 작동하지만 SQL Server는 형식을 결정해야하지만 불필요한 오버 헤드가 있습니다.

+0

나는 가지고 있었다. 그러나 내가 didnt하면, 내가 그것을하면 성능 부품에서 조금 더 좋을 것이다라는 것을 알고 있었다, 내가 지금 그것을 할 것이다 고 생각해라. RegExp 검사기를 사용하는 것이 여전히 필요하다고 생각하십니까? – Termiux

+0

사용자 입력을위한 Regex Validator가 매개 변수로 전달됩니까? – kd7

1

글쎄, 당신은 항상 당신에게 빠르고 명확한 대답을 줄 것이다 텍스트 상자에 SQL 문을 주입하려고 할 수 있습니다.

1

예, 상당히 안전합니다. 나중에 동적 SQL을 생성하기 위해 prepared statement에서 "sanitized"변수를 사용하지 않는다면 보통 괜찮습니다. 준비된 문장을 사용하고 있다는 사실은 이스케이프 문자 및 기타 간단한 주입 방법을 처리 할 것입니다.

그래도 난 다른 검증을 포기하지 않을 ...

+0

뭐가 좋아? 빈 필드를 확인하는 것 외에 다른 것을 확인해야합니까? – Termiux

+0

어떤 종류의 입력을 받으시겠습니까? 이치에 맞지 않는 것을 확인하십시오. 나는 매개 변수화 된/prepared 문을 사용하여 클라이언트 측과 서버 측 유효성 검사를하는 큰 팬이다. 사람들이 나에게 쓰레기를 줄 때보고 싶지 않다면 성공할 것 같지는 않지만 설득력이있을 것입니다. –