개발 - 언어/C#
SQL Injection & XSS 방지
수토리지
2025. 3. 6. 16:35
using System;
using System.Text.RegularExpressions;
public static class InputSanitizer
{
/// <summary>
/// SQL 관련 특수문자를 제거 (SQL Injection 방지)
/// </summary>
/// <param name="input">사용자 입력값</param>
/// <returns>필터링된 입력값</returns>
public static string SanitizeForSQL(string input)
{
if (string.IsNullOrEmpty(input))
return string.Empty;
// SQL Injection 방지를 위해 특수문자 제거
return Regex.Replace(input, @"[';#/\*]|--", string.Empty);
}
/// <summary>
/// HTML 태그 및 이벤트 속성을 제거하여 XSS 방지
/// </summary>
/// <param name="input">사용자 입력값</param>
/// <returns>필터링된 입력값</returns>
public static string SanitizeForXSS(string input)
{
if (string.IsNullOrEmpty(input))
return string.Empty;
// HTML 특수문자 인코딩
input = System.Web.HttpUtility.HtmlEncode(input);
// 허용되지 않은 태그와 이벤트 속성 제거 (화이트리스트 방식)
string tagPattern = @"<.*?>"; // HTML 태그 제거
string eventPattern = @"on\w+\s*=\s*[""'].*?[""']"; // 이벤트 속성 제거
input = Regex.Replace(input, tagPattern, string.Empty);
input = Regex.Replace(input, eventPattern, string.Empty);
return input;
}
}
재사용성을 위해 개별로 생성하여 SQL Injection 및 XSS용 메소드 생성
// 사용자 입력값 필터링
string rawInput = sample_Select.Text.Trim();
string sanitizedInput = InputSanitizer.SanitizeForSQL(rawInput); // SQL Injection 방지
sanitizedInput = InputSanitizer.SanitizeForXSS(sanitizedInput); // XSS 방지
switch (ddl_SampleType.SelectedValue)
{
case "이름":
txtSearch = AES.AESEncrypt256(sanitizedInput, "Privacy");
break;
case "전화번호":
txtSearch = AES.AESEncrypt256(sanitizedInput, "Privacy");
break;
default:
txtSearch = sanitizedInput; // 필터링된 값 사용
break;
}
string[] Param = {
ddl_SampleCode.SelectedValue,
ddl_SampleCode2.SelectedValue,
ddl_SampleCode3.SelectedValue,
ddl_SampleCode4.SelectedValue,
ddl_SampleCode5.SelectedValue,
txtSearch
};
ds = Common.GetPSData("Sample_procedure_name", Param);
입력값을 받는곳 혹은 작용하는곳에서 사용
그렇게 한번 걸러준 값을 Param으로써 사용하여 프로시저 호출