심재운 블로그




여러분들이 굳이 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 심재운

TAG : , , , ,

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band

본문과 관련 있는 내용으로 댓글을 남겨주시면 감사하겠습니다.

비밀글모드