개발 - 언어/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으로써 사용하여 프로시저 호출