ASP.NET CORE : 웹 개발을 위해 꼭 알아야하는 보안 대응
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