재우니의 블로그

 

 

ASP.NET MVC 및 ASP.NET Core 애플리케이션을 보호하는 것은 다양한 보안 취약성으로부터 보호하는 데 중요합니다. 아래에서는 귀하가 언급한 보안 문제를 해결하기 위한 몇 가지 샘플 코드와 모범 사례를 제공하겠습니다.

 

1. SQL INJECTION 

 

SQL 주입을 방지하려면 매개변수화된 쿼리나 Entity Framework와 같은 ORM을 사용하세요.

var query = "SELECT * FROM Users WHERE Username = @username AND Password = @password";
using (var connection = new SqlConnection(connectionString))
{
    connection.Open();
    var command = new SqlCommand(query, connection);
    command.Parameters.AddWithValue("@username", username);
    command.Parameters.AddWithValue("@password", password);
    // Execute the command
}

 

2. XSS(교차 사이트 스크립팅):

 

XSS를 방지하려면 사용자 생성 콘텐츠를 렌더링하기 전에 HTML로 인코딩하세요.

 

string userInput = "<script>alert('XSS Attack');</script>";
string encodedInput = HttpUtility.HtmlEncode(userInput);

 

3. CSRF(교차 사이트 요청 위조):

 

위조 방지 토큰을 사용하여 CSRF 보호를 구현합니다.

 

-- ASP.NET MVC
@Html.AntiForgeryToken()

그리고 요청을 처리할 때 서버에서 토큰의 유효성을 검사합니다.

 

4. 파일 업로드 공격:

 

파일 업로드를 검증하고 정리합니다. 허용되는 파일 형식을 제한하고 고유한 파일 이름을 사용하십시오.

 

[ValidateAntiForgeryToken]
[HttpPost]
public IActionResult Upload(IFormFile file)
{
    if (file != null && file.Length > 0)
    {
        var allowedExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif" };
        var fileExtension = Path.GetExtension(file.FileName);

        if (allowedExtensions.Contains(fileExtension))
        {
            var uniqueFileName = Guid.NewGuid().ToString() + fileExtension;
            var filePath = Path.Combine("uploads", uniqueFileName);

            using (var stream = new FileStream(filePath, FileMode.Create))
            {
                file.CopyTo(stream);
            }
        }
        else
        {
            // Invalid file type
        }
    }
    else
    {
        // No file uploaded
    }
}

 

5. COMMAND INJECTION

 

쉘 명령을 구성하기 위해 사용자 입력을 사용하지 마십시오. System.Diagnostics.Process와 같은 라이브러리를 안전하게 사용하세요.

 

var process = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = "cmd.exe",
        Arguments = "/c " + input, // Input should be sanitized
        RedirectStandardOutput = true,
        UseShellExecute = false,
        CreateNoWindow = true
    }
};
process.Start();
string result = process.StandardOutput.ReadToEnd();
process.WaitForExit();

 

6. 비밀번호 보안:

 

강력한 비밀번호 정책을 구현하고, 솔트를 사용하여 비밀번호를 해시하고, 키 스트레칭을 사용하세요.

 

ASP.NET Core ID를 사용하는 예:

 

services.Configure<IdentityOptions>(options =>
{
    options.Password.RequireDigit = true;
    options.Password.RequireLowercase = true;
    options.Password.RequireUppercase = true;
    options.Password.RequireNonAlphanumeric = true;
    options.Password.RequiredLength = 8;
});

DDoS 보호: DDoS 공격을 완화하려면 호스팅 공급자의 DDoS 보호 서비스 또는 솔루션을 사용하세요.

 

 

7. 무차별 대입 보호:

 

계정 잠금 정책 및 2단계 인증을 구현합니다.

 

ASP.NET Core ID는 기본적으로 계정 잠금을 지원합니다.

 

services.Configure<IdentityOptions>(options =>
{
    options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
    options.Lockout.MaxFailedAccessAttempts = 5;
});

 

보안은 지속적인 프로세스이며 최신 보안 모범 사례 및 취약점에 대한 업데이트를 유지하는 것이 안전한 애플리케이션을 유지하는 데 필수적이라는 점을 기억하십시오. 보안 조치를 구현할 때는 항상 애플리케이션의 특정 요구 사항과 아키텍처를 고려하십시오.

 

 

8. Inline Scripts 피하기

 

나쁜 습관(인라인 스크립트):.

<script>
    var userInput = '@Model.UserInput'; // Avoid this
</script>

 

선호 사례(외부 스크립트):

<div id="userInput" data-userinput="@Model.UserInput"></div>

 

// Separate JavaScript file (external-script.js)

// Retrieve the user input from the HTML element
var userInput = document.getElementById('userInput').getAttribute('data-userinput');

// You can now safely use userInput in JavaScript logic
// Perform any necessary validation or processing

 

<script src="external-script.js"></script>

 

9. Input Validation Libraries 사용:

 

 

DOMPurify 라이브러리 와 같은 JavaScript 라이브러리를 활용하여 사용자 생성 콘텐츠를 렌더링하기 전에 삭제하세요. 이 라이브러리는 안전하지 않은 HTML 및 JavaScript를 필터링하여 XSS 공격을 방지하는 데 도움이 됩니다.

 

//간단 샘플예제

<script type="text/javascript" src="src/purify.js"></script>
const $element = document.getElementByClassName('conatiner'); 

let dirty = '<img src="x" onerror="alert(document.cookie)">'
$element.innerHTML = DOMPurify.sanitize(dirty);

 

>> asp.net mvc 사용시 적용법

<!-- Include DOMPurify library -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/dompurify/2.3.5/purify.min.js"></script>

<!-- Sanitize user input before rendering -->
<div id="output">
    @Model.UserInput
</div>

<script>
    // Sanitize user input
    var userInput = '@Model.UserInput';
    var sanitizedInput = DOMPurify.sanitize(userInput);
    document.getElementById('output').innerHTML = sanitizedInput;
</script>

이러한 사례를 따르고 입력 유효성 검사, 출력 인코딩 및 적절한 보안 헤더를 적용하면 ASP.NET MVC 또는 ASP.NET Core 애플리케이션에서 JavaScript 주입 위험을 크게 줄일 수 있습니다. 잠재적인 취약점을 완화하려면 애플리케이션과 라이브러리를 최신 상태로 유지해야 합니다.

 

<참고자료>

 

 

참고사이트 

 

https://www.isac.or.kr/upload/JavaScript_시큐어코딩_가이드2022년.pdf

 

JavaScript_시큐어코딩_가이드2022년.pdf
1.39MB