재우니의 블로그

 

 
여러분들이 굳이 c# 코드에 동적쿼리를 실행하게 되다면 sql injection 공격에 노출이 될것입니다.
sql injection 공격을 피하기 위해서는 MS 에서는 파라미터화된 쿼리를 구현하도록 유도하는데요.

 
SqlCommand cmd = new SqlCommand("SELECT ID, FullName FROM User WHERE Login=@Login AND Password=@Password");
cmd.Parameters.Add("@Login", SqlDbType.NVarChar, 50).Value = Login.Text;
cmd.Parameters.Add("@Password", SqlDbType.NVarChar, 50).Value = Password.Text;SqlCommand cmd = new SqlCommand("SELECT FullName FROM User WHERE ID=@ID");
cmd.Parameters.Add("@ID", SqlDbType.Int).Value = int.Parse(Identity.Text);

 


이 또한 IN 쿼리를 사용하는데 매우 어려움이 있어서 어쩔수 없이 파라미터화된 쿼리로 구현하지 않고
구현하게 됩니다. 

따라서 이 부분에 대해 보완 차원상 아래와 같이 구현하면 어떨까 합니다.
 
string idList = Request.Form["Identities"];
if (IntListValidate(idList)) {
  SqlCommand cmd = new SqlCommand("SELECT FullName FROM User WHERE ID IN(" + idList + ")");
}
else {
  throw new InvalidDataException("잘못된 문자열이 포함되어 있습니다.");
}

private bool IntListValidate(string input) {
  for (int i = 0; i < input.Length; i++) {
    if (!Char.IsDigit(input, i) && input[i] != ',') return false;
  }
  return true;
}

 

 

위의 코드를 설명하자면 IN 쿼리에 INT 형의 콤마식으로 쿼리를 실행해야 하는데요.

 

SQL INJECTION  공격으로 인해 특정 문자열이 넘어올 수 있으므로 이를 

IntListValidate 메소드를 이용하여차단할 수 있지 않을까 합니다.

 

더 좋은 방법이 있으시면 공유하죠. ^__^

 

 

감사합니다. POSTED BY 심재운