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