2017-12-14 12 views
0

주석 처리 된 항목을 보면 사용자 입력을 직접 쿼리에 추가하여이 작업을 쉽게 얻을 수 있지만 매개 변수화하려고 시도하면 값SqlCommmand 매개 변수가 UPDATE 문에 추가되지 않음 (C#, MVC)

이 코드는

테이블 변수 @formTable

정의해야 오류 던지고하지만 문제가되는 값의 어느 것도 첨가되지는 ... 파라미터에 추가되고 , 테이블 변수뿐만 아니라 (re에 의해 검증 됨) 테이블 이름 변수를 정적 텍스트와 함께 배치).

이 프로젝트에서 완벽하게 작동하는 것과 같은 구조의 insert 문이 많이 있습니다. 여기서 내가 뭘 잘못하고 있니?

string constr = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; 

using (SqlConnection con = new SqlConnection(constr)) 
{ 
    //string query = "UPDATE " + s.formTable + " SET " + s.column + " = '" + s.cellValue + "' WHERE MasterID = '" + s.id + "'"; 
    string query = "UPDATE @formTable SET @column = @cellValue WHERE MasterID = @id;"; 

    using (SqlCommand cmd = new SqlCommand(query)) 
    { 
     //SqlParameter param = new SqlParameter("@formTable", s.formTable); 
     //cmd.Parameters.Add(param); 
     cmd.Parameters.AddWithValue("@formTable", s.formTable); 
     cmd.Parameters.AddWithValue("@column", s.column); 
     cmd.Parameters.AddWithValue("@cellValue", s.cellValue.ToString()); 
     cmd.Parameters.AddWithValue("@id", s.id.ToString()); 

     cmd.Connection = con; 

     con.Open(); 
     cmd.ExecuteNonQuery(); 
     con.Close(); 
    } 
} 

답변

1

매개 변수 값, 식별자 (테이블, 열 등)을 반대하지, 그래서 당신이 유일하게 유효한 매개 변수 @cellValue@id 있습니다.

사용자 입력에 따라 테이블/열 이름을 동적으로 설정하려면 문자열 연결을 고려해야합니다. 그러나, 반드시 SQL 주입을 의미하지는 않습니다. 알려진 값 집합에 대해 사용자 입력의 유효성을 검사하고 연결에서 알려진 값을 사용하기 만하면됩니다.

예를 들어, 모든 테이블 이름이있는 List<string>이 있다고 가정합니다. 테이블을 절대로 변경하지 않거나 데이터베이스에 querying some system/schema tables을 동적으로 추가하면 하드 코드 할 수 있습니다.

사용자가 테이블 이름에 대한 값을 입력하면 해당 값이 목록에 있는지 확인하십시오. 일치하는 경우 목록에서 일치하는 값을 사용하십시오. 그렇지 않은 경우 오류 상태 (예 : 사용자에게 메시지 표시)를 처리하십시오. 따라서 문자열 연결을 사용하더라도 실제 사용자 입력은 문자열에 입력되지 않습니다. 좋은 값인을 연결하는 것만으로도 이제는 문자열 리터럴과 다를 바 없습니다.