출처: MSDN
번역: Yunzhongcheng BLOG
적용 범위:
ASP.NET 버전 1.1
ASP.NET 버전 2.0
요약:
이 문서에서는 주로 주입 공격을 방지하기 위해 사용자 입력을 확인하는 방법을 소개합니다. 거의 모든 프로그램 수준 공격에는
필드, 쿼리 문자열 매개 변수, 쿠키 및 기타 사용자를 포함하여 확인해야 합니다
.입력 항목은 주입 공격으로부터 프로그램을 보호하는 데 사용됩니다. 모든 사용자 입력이 악의적이라고 가정하고 모든 사용자 입력이 서버 측에서 확인되도록 해야 합니다. 클라이언트 기반 유효성 검사를 사용하면 페이지의 체류 횟수를 줄일 수 있습니다. 성능을 향상하고 사용자 경험을 개선하지만 클라이언트 측 유효성 검사는 해커에 의해 쉽게 속일 수 있으므로 이것에만 의존하지 마십시오.
입력 콘텐츠의 유효성을 검사하려면 각 입력 필드에 대해 허용 가능한 입력 규칙을 정의해야 합니다. 입력 필드의 길이, 범위, 형식 및 유형을 기준으로 제한을 만드는 것입니다. 잘못된 문자 목록 대신 허용되는 문자 제한 목록을 사용하여 입력을 제한하는 것은 거의 불가능하므로 좋지 않습니다. 유해한 입력을 모두 필터링하려면
HTML 문자 입력을 허용해야 하는 경우 HtmlEncode와 같은 방법을 사용하여 표시하기 전에 안전하게 인코딩하는 것이 가장 좋습니다.
내용:
목적
개요
단계별 구현 피드
1단계. ASP 사용 . NET 요청 확인
2단계. 권한
제약 조건 입력 사용 3단계.
SQL 문에 대한 명령 매개변수 사용 5단계.
추가 리소스가
반환되지 않는지 확인합니다.
------------------------------------- ------------------------------
목적:
입력 문자열 길이, 범위, 형식 및 유형을 제한합니다.
ASP.NET 프로그램을 개발할 때 주입 공격을 방지하려면 요청 유효성 검사를 사용하세요.
입력 유효성 검사에는 ASP.NET 유효성 검사 컨트롤을 사용합니다.
안전하지 않은 출력을 인코딩합니다.
명령 매개변수 설정 패턴을 사용하여 주입 공격을 방지합니다.
오류 세부 정보가 클라이언트에 반환되는 것을 방지합니다.
개요:
애플리케이션에서 신뢰할 수 없는 모든 입력을 검증해야 합니다. 사용자는 사용자 프록시 문자열 및 애플리케이션에서 양식 필드, 쿼리 문자열, 클라이언트 쿠키 및 브라우저 환경 값을 제공할 수 있습니다. IP 주소 등
약한 입력 검증은 일반적으로 주입 공격의 기회를 제공합니다. 다음은 약한 입력 검증 또는 입력 검증 없음을 사용하는 일반적인 공격 방법입니다.
SQL 주입. 사용자 입력 값을 사용하여 SQL 문을 동적으로 구성하면 데이터베이스가 공격적이고 유해한 SQL 문을 실행할 수 있습니다.
사이트 간 스크립팅 공격은 웹 페이지 유효성 검사 취약점을 이용하여 클라이언트측 스크립트를 삽입합니다. 그런 다음 이러한 코드는 신뢰할 수 있는 클라이언트 컴퓨터로 전송되고 브라우저에서 해석되고 실행됩니다. 브라우저는 코드가 유해하다는 것을 알 수 없습니다.
무단 파일 액세스. 코드가 호출자의 입력을 수락하면 악의적인 사용자가 파일 작업을 보고 보호된 파일에 액세스하거나 코드를 사용하여 불법 데이터를 삽입할 수 있습니다.
참고: 주입 공격은 HTTP 또는 HTTPS SSL(Secure Socket Layer) 연결을 사용하여 이루어질 수 있습니다. 전송 암호화 기술은 공격을 방지하는 데 사용할 수 없습니다.
아래에는 네트워크를 통해 입력이 필요한 모든 곳에서 유효성 검사를 수행해야 합니다. 필터링 전략은 올바른 입력만 허용하고 잘못된 입력은 거부해야 한다는 점에 유의하세요. 모두 필터링하는 것보다 낫습니다. 불법 입력을 탐지하는 것은 쉽지만 일반적으로 불법 입력을 모두 포함하는 것은 어렵습니다.
다음 측면을 통해 입력 내용을 확인하십시오.
제약 조건. 입력이 올바른 유형, 문자 길이, 형식 및 범위인지 확인합니다. ASP.NET 유효성 검사 컨트롤을 적용하여 서버 컨트롤 입력을 제한할 수 있습니다. 정규식 및 사용자 지정 유효성 검사 규칙을 사용하여 다른 소스의 입력을 제한할 수 있습니다.
거부. 알려진 유해 데이터 입력을 감지하고 거부합니다.
필터링. 때로는 보안 위험을 초래하는 사용자 입력 부분을 필터링하고 싶을 수도 있습니다. 예를 들어 애플리케이션이 메모 필드와 같은 자유 형식 입력을 허용하는 경우 <b>, <i와 같은 특정 안전한 HTML 태그를 허용합니다. > 및 기타 HTML 태그.
단계 요약
다음 단계에 따라 ASP.NET 응용 프로그램을 주입 공격으로부터 보호하세요.
1단계. ASP.NET 요청 확인을 사용합니다.
2단계. 입력을 제한합니다.
3단계. 안전하지 않은 출력을 인코딩합니다.
4단계. SQL 쿼리문에 명령 매개변수를 사용합니다.
5단계. ASP.NET 오류 정보가 클라이언트에 유출되지 않았는지 확인합니다.
다음 장에서는 이러한 단계를 자세히 설명합니다.
1단계. ASP.NET 요청 유효성 검사 사용
기본적으로 ASP.NET 1.1 및 2.0 요청 유효성 검사는 서버로 전송된 데이터에 HTML 마크업 요소와 예약된 문자가 포함되어 있는지 확인합니다.
요청유효성
검사는 잠재적으로 위협이 되는 문자열 목록과 일치하며, 예외가 발견되면 HttpRequestValidationException 유형의 예외가 발생합니다.
이 기능을 비활성화하려면 페이지> 요소에 "false"를 설정하거나 별도 페이지의 @Pages 요소에 ValidateRequest = "false"를 설정하면
필요한 페이지에서만 비활성화할 수 있습니다. 예를 들어 HTML 형식의 입력을 허용하는 필드를 프로그램 페이지에 포함하는 경우
Machine.config 파일에서 요청 유효성 검사 기능이 켜져 있는지 확인하십시오
. 요청 유효성 검사 기능은 ASP.NET에서 기본적으로 활성화되어 있습니다. Machine.config.comments 파일에서 이 작업을 수행할 수 있습니다.
<pages verifyRequest = "true" ... />
서버의 Machine.config 및 응용 프로그램 웹에서 기본 설정을 수정하지 않았는지 확인하세요. ASP.NET
요청 유효성 검사
다음과 같이 ValidateRequest = "fasle"을 설정하여 ASP.NET 페이지를 만들고 요청 유효성 검사를 비활성화할 수 있습니다.
<%@ Language="C#" ValidateRequest="false" %>
<html>
<스크립트 runat="서버">
void btnSubmit_Click(객체 전송자, EventArgs e)
{
// ValidateRequest가 false이면 'hello'가 표시됩니다.
// ValidateRequest가 true이면 ASP.NET은 예외를 반환합니다.
Response.Write(txtString.Text);
}
</script>
<본문>
<form id="form1" runat="서버">
<asp:TextBox id="txtString" runat="서버"
Text="<script>alert('hello');</script>" />
<asp:Button id="btnSubmit" runat="서버" OnClick="btnSubmit_Click"
텍스트="제출" />
</form>
</body>
</html>
페이지를 실행하면 txtString의 스크립트가 클라이언트 브라우저에서 실행되고 처리되므로 메시지 상자에 "Hello"가 표시됩니다.
ValidateRequest = "true"를 설정하거나 ValidateRequest 페이지 특성을 제거하면 ASP .NET 요청 유효성 검사가 수행됩니다. 스크립트 입력을 거부하고 아래와 같은 오류 메시지를 표시합니다.
잠재적으로 위험한 Request.Form 값이 클라이언트(txtString="<script>alert('hello"))에서 감지되었습니다.
요청 검증 기능에만 의존하지 말고, 사용자 정의 검증을 위한 안내 방법으로만 사용하십시오.
Step 2. 입력을 제한
하려면 다음 방법을 사용하십시오.
서버 측 입력 검증을 사용하십시오. 쉽게 우회할 수 있으므로 클라이언트 측 검증에 의존하지 마십시오. 페이지 반송 횟수를 줄이고 성능을 향상시키며 사용자 경험을 향상시키십시오.
입력 내용이 정확하고 요구 사항을 충족하는지 확인하세요.
강력한 데이터 유형을 사용하십시오. 숫자 입력에는 정수 또는 Double과 같은 유형을 지정하십시오. 문자 입력에는 날짜 및 시간 유형을 지정하십시오.
양식에서 HTML 컨트롤 입력 필드의 유효성을 검사하려면 서버 측 코드에서 유효성 검사를 수행하세요. Regex 정규식 유형을 사용하면 문자 입력을 제한하는 데 도움이 됩니다
.
이름, 주소, 팩스, 출생 증명서 번호 등의 문자열 필드를 확인하려면 정규식을 사용하세요.
허용되는 문자 범위를 제한합니다.
예를 들어 세금 ID, 우편번호 등의 패턴 기반 필드에는 지정된 문자 패턴이 필요합니다.
길이를 확인하세요.
정규식 유효성 검사 컨트롤(RegularExpresionValidator) 사용
정규식 유효성 검사 컨트롤을 사용하려면 확인할 컨트롤 이름(ControlToValidate), 유효성 검사 식(ValidationExpression) 및 오류 메시지(ErrorMessage)를 설정해야 합니다. 관련 속성 설정은 코드를 참조하세요. 아래 예.
<form id="WebForm" method="post" runat="서버">
<asp:TextBox id="txtName" runat="서버"></asp:TextBox>
<asp:RegularExpressionValidator id="nameRegex" runat="서버"
ControlToValidate="txt이름"
ValidationExpression="^[a-zA-Z'.s]{1,40}$"
ErrorMessage="잘못된 이름">
</asp:정규식 유효성 검사기>
</form>
위 코드에서는 입력 이름을 문자(대문자 및 소문자 허용), 공백, O'Dell과 같은 단일 이름 줄임표 및 마침표로 제한하기 위해 정규식을 사용합니다. 또한 입력 문자 길이는 40자로 제한됩니다. 문자
정규식 유효성 검사 컨트롤(RegularExpressionValidator)은 캐럿(^)과 달러 기호($)를 사용자 정의 표현식에 추가하지 않은 경우 자동으로 추가하는 것이 가장 좋습니다. 구분 기호를 추가하는 것은
서버측 컨트롤을 사용하지 않거나(즉, 유효성 검사 컨트롤을 사용할 수 없음을 의미)
정규식 클래스(Regex 클래스)를 사용하는 것
입니다.양식 필드(예: 쿼리 문자열 매개 변수 및 쿠키)가 아닌 입력 필드 소스의 경우 정규식 클래스(Regex 클래스)를 사용하면
using
문을 추가하여 System.Text.RegularExpressions 네임스페이스를 가져올 수 있습니다
.접두사.
정규식에 "^" 및 "$"(문자열 시작 부분, 문자열 끝 부분)가 포함되어 있는지 확인하세요.
Regex 클래스의 IsMatch 메서드를 호출합니다. 다음은 코드 예제입니다.
//인스턴스 메소드:
정규식 reg = new Regex(@"^[a-zA-Z'.s]{1,40}$");
Response.Write(reg.IsMatch(txtName.Text));
// 정적 메서드:
if (!Regex.IsMatch(txtName.Text,@"^[a-zA-Z'.s]{1,40}$"))
{
// 이름이 표현식과 일치하지 않습니다.
}
자주 사용하는 정규식을 캐시할 수 없는 경우 IsMatch 정적 메서드를 사용하여 성능을 향상하고 불필요한 개체 생성을 방지해야 합니다.
숫자 필드 유효성 검사
대부분의 경우 숫자 입력 및 범위를 확인하려면 서버 컨트롤을 사용해야 합니다. 숫자 필드의 경우 RangeValidator 컨트롤을 사용합니다. RangeValidator는 통화, 날짜, 정수, 배정밀도 및 문자열 유형 데이터를 지원합니다.
RangeValidator 컨트롤을 사용하려면 컨트롤 이름(ControlToValidate), 유형(Type) 및 최소값(MinimumValue)을 설정해야 합니다. ), 최대값(MaximumValue) 및 오류 메시지(ErrorMessage) 속성입니다. 코드 예시는 다음과 같습니다.
<asp:RangeValidator
ID="RangeValidator1"
Runat="서버"
ErrorMessage="범위가 잘못되었습니다. 숫자는 0에서 255 사이여야 합니다."
ControlToValidate="범위입력"
최대값="255"
최소값="0" 유형="정수" />
서버 컨트롤을 사용하지 않는 경우 입력 값을 정수로 변환한 다음 유효성을 검사하여 숫자의 범위 확인을 완료할 수 있습니다. 예를 들어 정수가 유효한지 확인하려면 ASP.NET 2.0에서 제공하는 새로운 메서드 Int32.TryParse를 사용하여 입력 값을 System.Int32의 변수 유형으로 변환합니다. 이 메서드는 변환이 실패할 경우 false를 반환합니다.
Int32i;
if (Int32.TryParse(txtInput.Text, out i) == false)
{
//변환 실패
}
이전 버전의 ASP.NET을 사용하는 경우 try/catch 블록에서 Int32.Parse
또는
Convert.ToInt32 메서드를 사용하고 변환이 실패할 때 발생하는 FormatException을 처리할 수 있습니다.
from HTML 텍스트 상자의 정수 유형의 유형 및 범위입니다.
<%@ Page Language="C#" %>
<script runat="server">
void Page_Load(개체 전송자, EventArgs e)
{
if (Request.RequestType == "POST")
{
나는 int;
if (Int32.TryParse(Request.Form["integerTxt"], out i) == true)
{
// TryParse는 변환이 성공하면 true를 반환합니다.
if ((0 <= i && i <= 255) == true)
{
Response.Write("입력된 데이터가 유효합니다.");
}
또 다른
Response.Write("입력 데이터가 범위를 벗어났습니다.");
}
또 다른
Response.Write("입력 데이터가 정수가 아닙니다.");
}
}
</스크립트>
<html>
<본문>
<form id="form1" action="NumericInput.aspx" method="post">
<div>
0에서 255 사이의 정수를 입력하세요.
<입력 이름="integerTxt" type="text" />
<입력 이름="제출" 유형="제출" 값="제출" />
</div>
</form>
</body>
</html>
날짜 필드 유효성 검사
날짜 필드가 올바른 유형인지 확인해야 합니다. 예를 들어 서버 컨트롤을 사용하는 경우 해당 필드가 미래인지 과거인지 확인해야 합니다. 날짜 입력 값을 캡처하고 값이 특정 범위 내에 있도록 하려면 범위 유효성 검사 컨트롤(RangeValidator)을 사용하고 허용되는 유형을 날짜 유형으로 설정할 수 있습니다. 이 컨트롤을 사용하면 특수 기간을 지정할 수 있습니다. 시작 순간을 설정하여 시간이 미래인지 과거인지 확인하는 등 확인을 위한 참조로 오늘 시간을 사용해야 하는 경우 CustomValidator 유효성 검사 컨트롤을 사용할 수 있습니다.
CustomValidator 컨트롤을 사용하여 날짜의 유효성을 검사하려면 ControlToValidate 및 ErrorMessage 속성을 설정하고 OnServerValidate 이벤트에 사용자 지정 유효성 검사 논리 메서드를 지정해야 합니다. 다음은 샘플 코드입니다.
<%@ Page Language="C#" %>
<script runat="server">
void ValidateDateInFuture(객체 소스, ServerValidateEventArgs args)
{
DateTime dt;
// 유효한 날짜를 확인하고 날짜가 미래인지 확인합니다.
if ((DateTime.TryParse(args.Value, out dt) == false) ||
(dt <= 날짜시간.오늘))
{
args.IsValid = 거짓;
}
}
</script>
<html>
<본문>
<form id="form1" runat="서버">
<div>
<asp:레이블 ID="Label1" Runat="서버"
Text="향후 날짜:"></asp:Label>
<asp:TextBox ID="futureDatetxt" Runat="서버"></asp:TextBox>
<asp:CustomValidator
ID="CustomValidator1" Runat="서버"
ErrorMessage="날짜가 잘못되었습니다. 미래의 날짜를 입력하세요."
ControlToValidate="futureDatetxt"
OnServerValidate="ValidateDateInFuture">
</asp:CustomValidator>
<br />
<asp:Button ID="submitBtn" Runat="server" Text="Submit" />
</div>
</form>
</body>
</html>
위의 코드는 ASP.NET 2.0에서 제공하는 새로운 메서드인 DateTime.TryParse를 사용합니다.
자유 텍스트 필드를 필터링
하여 입력을 필터링하려면 프로그램에서 안전하지 않은 입력이 코드로 처리되지 않도록 해야 합니다. 공유 데이터베이스의 데이터를 읽을 수 없습니다. 먼저 출력 시 위험하지 않도록 데이터를 필터링해야 합니다. 먼저 입력 값을 인코딩하려면 HttpUtility.HtmlEncode를 사용하세요
.
@Page 페이지 요소 ValidateRequest = "false"에 다음 필드를 추가하여 ASP.NET 요청 유효성 검사를 비활성화합니다. HtmlEncode 메서드를 사용하여 StringBuilder 개체를 사용하고 해당 메서드를 호출하여 문자의 HTML을 바꿉니다. 다음 코드는 이 접근 방식의 예입니다. 이 페이지는 ValidateRequest = "fasle"을 설정하여 ASP.NET 요청 유효성 검사를 비활성화합니다. HTML 인코딩을 사용하면 간단한 텍스트 형식을 표시할 수 있습니다. .
<%@ Page Language="C#" ValidateRequest="false"%>
<script runat="server">
void submitBtn_Click(객체 전송자, EventArgs e)
{
// 문자열 입력을 인코딩합니다.
StringBuilder sb = 새로운 StringBuilder(
HttpUtility.HtmlEncode(htmlInputTxt.Text));
// 선택적으로 허용하고 <i>
sb.Replace("<b>", "<b>");
sb.Replace("</b>", "");
sb.Replace("<i>", "<i>");
sb.Replace("</i>", "");
Response.Write(sb.ToString());
}
</스크립트>
<html>
<본문>
<form id="form1" runat="서버">
<div>
<asp:TextBox ID="htmlInputTxt" Runat="서버"
TextMode="MultiLine" 너비="318px"
높이="168px"></asp:TextBox>
<asp:Button ID="submitBtn" Runat="서버"
Text="제출" OnClick="submitBtn_Click" />
</div>
</form>
</body>
</html>
쿼리 문자열 값 유효성 검사
쿼리 문자열의 길이, 범위, 형식 및 유형을 확인합니다. 일반적으로 결합된 정규식을 사용하여 다음 작업을 수행합니다.
입력 값 제한 명시적 범위 검사 설정 입력 유형을 지정하고 ASP.NET으로 변환합니다. 플랫폼 다음 유형은 유형 변환으로 인해 발생한 모든 예외를 처리합니다. 다음 코드 예제에서는 Regex 클래스를 사용하여 쿼리 문자열에 전달된 이름 문자열의 유효성을 검사하는 방법을 보여줍니다.
void Page_Load(개체 전송자, EventArgs e)
{
if (!System.Text.RegularExpressions.Regex.IsMatch(
Request.QueryString["이름"], @"^[a-zA-Z'.s]{1,40}$"))
Response.Write("잘못된 이름 매개변수");
또 다른
Response.Write("이름은 " + Request.QueryString["이름"]);
}
쿠키 값 검증
쿼리 문자열과 같이 쿠키에 저장된 값은 사용자가 쉽게 수정할 수 있습니다. 또한 이러한 값의 길이, 범위, 형식 및 유형을 검증합니다.
프로그램이 파일 입력
을 허용하는 경우.
이름, 파일 주소 또는 파일 저장 경로가 올바른 형식인지, 프로그램의 실제 상황에 따라 유효한 위치를 가리키는지 확인해야 합니다. 이 확인이 실패하면 프로그램이 실수로 액세스하도록 요청받을 수 있습니다.
파일 경로를 확인하십시오
.
사용자가 파일에 액세스하기 위해 프로그램을 이용하는 것을 방지하려면 사용자가 작성한 코드로 입력한 파일이나 파일 경로를 허용하지 않도록 하십시오.
입력 파일 이름을 허용하는 경우 시스템을 사용하십시오. .IO.Path.GetFileName 메서드를 사용하여 파일의 전체 이름을 가져옵니다. 입력 파일 경로를 수락하고 System.IO.Path.GetFullPath를 사용하여 전체 파일 경로를 가져오는 경우 애플리케이션 간 매핑을 방지하려면 MapPath 메서드를 사용하세요. .
MapPath 메서드를 사용하여 제공된 가상 디렉터리를 서버의 실제 디렉터리에 매핑하는 경우 bool 매개 변수와 함께 오버로드된 Request.MapPath 메서드를 사용하여 애플리케이션 간 매핑을 방지합니다.
노력하다
{
문자열 mappedPath = Request.MapPath( inputPath.Text,
요청.응용프로그램 경로, 거짓);
}
캐치(HttpException)
{
// 애플리케이션 간 매핑을 시도했습니다.
}
마지막 false 매개 변수는 응용 프로그램 간 매핑을 방지합니다. 즉, 사용자는 "..." 구문을 사용하여 지정한 가상 디렉터리 내에 없는 잘못된 경로를 제공할 수 없습니다.
서버 컨트롤을 사용하는 경우 Control.MapPathSecure 메서드를 사용하여 가상 디렉터리에 해당하는 실제 디렉터리 주소를 얻을 수 있습니다.
Control.MapPathSecure 메서드는 승인되지 않은 파일에 액세스할 때 HttpException을 발생시킵니다. 자세한 내용은 .NET Framework 설명서의 Control.MapPathSecure 메서드 소개를 참조하세요.
코드 액세스 보안을 사용하여 파일 입력 및 출력 제한
관리자는 프로그램의 신뢰성을 "보통"으로 설정하여 프로그램이 상주하는 가상 디렉터리에 파일을 읽고 쓰는 기능을 제한할 수 있습니다. .NET 코드 보안 메커니즘은 프로그램이 위치한 가상 디렉터리 외부에 파일 액세스 권한이 없도록 보장합니다.
응용 프로그램의 신뢰 수준을 "보통"으로 설정하려면 다음을 추가할 수 있습니다.
< 신뢰 수준 = "보통" />
URL 확인
다음과 같은 정규식을 사용하여 URL을 일치시킬 수 있습니다.
^(?:http|https|ftp)://[a-zA-Z0-9 .-]+(?::d {1,5})?(?:[A-Za-z0-9.;:@&=+$,? /]|%u[0-9A-Fa- f]{4}|%[0-9A-Fa-f]{2})*$
이는 입력 형식을 제한할 뿐이며 애플리케이션 범위 내에서 허용되는지 여부를 확인하지 않습니다. 예를 들어, 애플리케이션이 지정한 서버와 통신합니까?
3단계. 안전하지 않은 코드 인코딩
웹 페이지의 경우 HttpUtility.HtmlEncode 메서드를 사용하여 인코딩합니다. 텍스트가 사용자 입력, 데이터베이스 또는 로컬 파일에서 나온 경우 항상 이렇게 해야 합니다.
마찬가지로 사용자 입력 콘텐츠, 데이터베이스 등에서 왔기 때문에 안전하지 않은 문자가 포함된 URL을 작성하는 경우 HttpUtility.UrlEncode 메서드를 인코딩합니다.
데이터를 저장하기 전에 인코딩하면 저장된 데이터가 손상될 수 있으므로 표시할 때 가능한 한 나중에 인코딩해야 합니다.
안전하지 않은 출력 인코딩의 경우
HtmlEncode가 HTML 태그를 대체합니다. 이러한 기호를 나타내기 위해 특수 텍스트 문자열을 사용하고 브라우저가 이를 HTML 태그로 해석하지 못하도록 합니다. 예를 들어 "<"는 < "(콜론)으로 대체됩니다. 이 태그는 무해한 텍스트로 표시됩니다.
<%@ 페이지 언어="C#" ValidateRequest="false" %>
<script runat="서버">
void submitBtn_Click(객체 전송자, EventArgs e)
{
Response.Write(HttpUtility.HtmlEncode(inputTxt.Text));
}
</script>
<html xmlns=" http://www.w3.org/1999/xhtml " >
<본문>
<form id="form1" runat="서버">
<div>
<asp:TextBox ID="inputTxt" Runat="서버"
TextMode="MultiLine" 너비="382px" 높이="152px">
</asp:텍스트박스>
<asp:Button ID="submitBtn" Runat="서버" Text="제출"
OnClick="submitBtn_Click" />
</div>
</form>
</body>
</html>
HTML 인코딩의 효과를 보려면 가상 디렉터리를 만들고 앞서 언급한 파일을 넣은 다음 이 페이지를 실행하고 텍스트 상자에 HTML 코드를 입력한 후 제출 버튼을 클릭하세요. 예를 들어 다음 입력은 정상적으로 표시됩니다. 스크립트
를 실행하고 인사하세요 <script>alert('hello');</script>
HtmlEncode 메서드에 대한 호출을 제거하고 단순히 텍스트 내용을 입력하면 브라우저가 코드를 실행하고 프롬프트 상자를 표시합니다.
UrlEncode 메소드를 사용하는 것은 안전하지 않습니다. URL 주소 인코딩
특정 보안 위험을 초래할 수 있는 사용자 입력 부분으로 URL 매개 변수를 가져와야 하는 경우 HttpUtility.UrlEncode 메소드를 사용하여 주소 문자열을 인코딩합니다
. ;
4단계. SQL 명령문은
삽입 공격을 방지하기 위해 SQL 매개변수 방법을 사용합니다. 매개변수 컬렉션은 유형 감지 및 길이 감지를 제공합니다. 매개변수 설정 방법을 사용하면 입력 유형이 범위를 벗어날 경우 입력 유형과 길이를 엄격하게 제한할 수 있다는 추가 이점이 있습니다. 예외가 발생합니다.
저장 프로시저를 호출할 때 아래에 설정된 매개변수를 사용하십시오.
코드 조각은 저장 프로시저를 호출할 때 매개변수 세트를 사용하는 예를 보여줍니다.
SqlDataAdapter myCommand = new SqlDataAdapter("AuthorLogin",
myConnection);
myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
SqlParameter parm = myCommand.SelectCommand.Parameters.Add(
"@LoginId", SqlDbType.VarChar, 11);
parm.Value = 로그인.텍스트;
자신만의 SQL 문을 생성할 때 매개변수 세트를 사용하세요.
저장 프로시저를 사용할 수 없는 경우에도 매개변수 세트를 사용할 수 있습니다. 아래 코드를 참조하세요.
SqlDataAdapter myCommand = 새 SqlDataAdapter(
"au_id = @au_id인 작성자의 au_lname, au_fname 선택", myConnection);
SQLParameter parm = myCommand.SelectCommand.Parameters.Add(
"@au_id" ,SqlDbType.VarChar, 11);
Parm.Value = 로그인.텍스트;
SQL 주입 공격을 방지하는 방법에 대한 자세한 내용은 방법: ASP.NET에서 SQL 주입 방지
5단계. ASP.NET 오류 메시지가 클라이언트에 반환되지 않는지 확인하려면
<customErrors> 요소를 사용할 수 있습니다. 클라이언트를 구성하려면 프로그램 오류 감지 메커니즘을 통해 일반 오류 메시지가 클라이언트에 반환되어야 합니다.
web.config의 모드 속성을 "remoteOnly"로 변경했는지 확인하세요.
<customErrors 모드 = "remoteOnly">
ASP.NET 프로그램 설치 후 다음과 같이 클라이언트의 오류 메시지 페이지를 지정할 수 있습니다.
<customErrors mode = "on" defaultRedirect = "YourErrorPage.htm">
추가 리소스를 보려면 관련 항목(
정규식을 사용하여 ASP.NET에서 입력을 제한하는 방법)을 참조하십시오.
SQL 주입 공격 방지
및 사이트 간 스크립팅 공격 방지.
추신: 드디어 다 읽었네요. 거의 3일이나 걸렸어요. 사실 이 문장들을 보면 아주 간단해요. 처음으로 번역을 해봤는데, 번역이 좋지 않더라도 양해 부탁드립니다.