강한 반응 html. 미친 모양. 이메일 주소

크로스 사이트 스크립트 주입 공격

XSS(교차 사이트 스크립팅) 공격에서 공격자는 합법적인 웹 페이지에 악성 코드를 삽입한 다음 클라이언트 측에서 악성 스크립트를 실행합니다. 사용자가 감염된 페이지를 방문하면 스크립트가 사용자의 브라우저에 다운로드되어 실행됩니다. 이 계획에는 다양한 종류가 있습니다. 악성 스크립트는 브라우저 쿠키, 세션 토큰 또는 브라우저에 저장된 기타 민감한 정보에 액세스할 수 있습니다. 그러나 모든 공격은 그림 1에 표시된 방식에 따라 작동합니다.

그림 1. 그림 1. 일반적인 XSS 공격
XSS 취약점

일반적인 XSS 공격에서 공격자는 서버의 웹 페이지에 문자열을 삽입하는 방법을 찾습니다. 공격자가 웹 페이지에 다음 줄을 삽입했다고 가정해 보겠습니다. Alert("you are under Attack") . 사용자가 이 페이지를 방문할 때마다 브라우저는 이 스크립트를 다운로드하여 페이지의 나머지 콘텐츠와 함께 실행합니다. 이 경우, 스크립트를 실행한 결과, 사용자는 "당신은 공격을 받고 있습니다."라는 텍스트가 포함된 팝업 창을 보게 됩니다.

XSS의 결과

공격자가 웹 응용 프로그램의 XSS 취약점을 악용할 수 있는 경우 데이터에 대한 액세스를 제공하는 스크립트를 페이지에 삽입할 수 있습니다. 계정사용자. 이 경우 공격자는 다음과 같은 많은 악의적인 작업을 수행할 수 있습니다.

  • 계정을 훔치세요.
  • 바이러스 확산;
  • 귀하의 검색 기록 및 클립보드 내용에 접근합니다.
  • 기회를 얻으세요 리모콘브라우저;
  • 내부 네트워크의 하드웨어 및 소프트웨어 리소스와 애플리케이션을 스캔하고 사용합니다.
XSS 공격 방지

XSS 공격을 방지하려면 애플리케이션은 페이지 출력을 최종 사용자에게 전달하기 전에 암호화해야 합니다. 출력 데이터를 암호화하는 경우 HTML 마크업대체 표현으로 대체 - 사물. 브라우저는 이러한 개체를 표시하지만 실행하지는 않습니다. 예를 들어 .

표 1은 일부 일반적인 HTML 문자의 개체 이름을 보여줍니다.

표 1. HTML 문자의 개체 이름 결과 설명 개체 이름 개체 번호
중단되지 않는 공간
< 미만<
> 이상> >
& 앰퍼샌드& &
¢ 센트¢ ¢
£ 파운드£ £
¥ 예나¥ ¥
유로
§ § §
© 저작권 ©
® ® ®
등록 상표

브라우저가 객체를 발견하면 다시 HTML로 변환되어 인쇄되지만 실행되지는 않습니다. 예를 들어, 공격자가 서버 웹 페이지의 변수 필드에 경고("공격을 받고 있습니다")라는 문자열을 삽입하면 설명된 전략을 사용할 때 서버는 경고("공격을 받고 있습니다")라는 문자열을 반환합니다. .

브라우저가 암호화된 스크립트를 다운로드하면 이를 경고("공격을 받고 있습니다")로 변환하고 해당 스크립트를 웹 페이지의 일부로 표시하지만 실행하지는 않습니다.

서버측 Java 애플리케이션에 HTML 코드 추가

악성 스크립트 코드가 페이지와 함께 렌더링되는 것을 방지하려면 애플리케이션에서 페이지에 렌더링되기 전에 모든 문자열 변수를 암호화해야 합니다. 암호화는 다음으로 구성됩니다. 단순 변환다음과 같이 각 문자를 해당 HTML 개체 이름에 추가합니다. 자바 코드목록 1에 나와 있습니다.

목록 1. 문자를 HTML 객체 이름으로 변환 public class EscapeUtils ( public static final HashMap m = new HashMap(); static ( m.put(34, """); //< - меньше чем m.put(60, ""); // >-보다 큼 //사용자는 모두 일치해야 합니다. HTML 객체해당 십진수 값으로. //십진수 값에 대한 객체 매핑은 아래 표와 같습니다) public static String escapeHtml() ( String str = "alert(\"abc\")"; try ( StringWriterwriter = new StringWriter((int) (str .length() * 1.5)); escape(writer, str); System.out.println("인코딩된 문자열은 " +writer.toString()); returnwriter.toString(); ) catch (IOException ioe) ( ioe .printStackTrace() ; return null; ) ) public static void escape(Writerwriter, String str)는 IOException을 발생시킵니다( int len ​​​​= str.length(); for (int i = 0; i< len; i++) { char c = str.charAt(i); int ascii = (int) c; String entityName = (String) m.get(ascii); if (entityName == null) { if (c >0x7F) (writer.write("");writer.write(Integer.toString(c, 10));writer.write(";"); ) else (writer.write(c); ) ) else (작가. 쓰기(엔티티 이름); ) ) ) )

목록 1의 Java 코드는 HTML 문자열 String String "alert(\"abc\)" 를 인코딩합니다. 다음 절차를 사용하십시오.

결과적으로 다음 줄이 출력에 나타납니다: Alert("abc") .

표 2는 HTML 객체를 십진수 값으로 매핑하는 것을 보여줍니다.

표 2. HTML 객체 10진수 값 10진수 값 개체 설명
160 중단되지 않는 공간
60 < 미만
62 > 이상
38 & 앰퍼샌드
162 ¢ 센트
163 £ 파운드
165 ¥ 예나
8364 유로
167 §
169 저작권
174 ® 등록 상표
8482 등록 상표
결론

사이트 간 스크립트 삽입은 사용자 컴퓨터를 공격하는 가장 일반적인 방법 중 하나입니다. 그러나 공격자가 웹 응용 프로그램을 악성 코드로 감염시키는 능력을 크게 줄일 수 있습니다. 애플리케이션을 구축할 때 최종 사용자의 브라우저에 보내기 전에 모든 페이지 출력 값을 암호화하도록 주의하세요.

컨트롤러에서 응답 생성

컨트롤러는 요청 처리를 마친 후 일반적으로 응답을 생성해야 합니다. IController 인터페이스를 직접 구현하여 하위 수준 컨트롤러를 생성하는 경우 클라이언트에 대한 응답 생성을 포함하여 요청 처리의 모든 측면을 책임져야 합니다.

예를 들어 HTML 응답을 보내려면 HTML 데이터를 만들고 구성한 다음 Response.Write() 메서드를 사용하여 클라이언트에 보내야 합니다. 마찬가지로 사용자의 브라우저를 다른 URL로 리디렉션하려면 Response.Redirect() 메서드를 호출하고 필요한 URL을 전달해야 합니다. 두 접근 방식 모두 아래 코드에 설명되어 있습니다. 이 코드는 이전 문서에서 IController 인터페이스를 구현하여 만든 BasicController 클래스의 확장을 보여줍니다.

System.Web.Mvc 사용; System.Web.Routing 사용; 네임스페이스 ControllersAndActions.Controllers ( 공용 클래스 BasicController: IController ( 공용 void Execute(RequestContext requestContext) ( 문자열 컨트롤러 = (문자열)requestContext.RouteData.Values["controller"]; 문자열 작업 = (문자열)requestContext.RouteData.Values["action "]; if (action.ToLower() == "redirect") ( requestContext.HttpContext.Response.Redirect("/Derived/Index"); ) else ( requestContext.HttpContext.Response.Write(string.Format("Controller) : (0), 동작 방법: (1)", 컨트롤러, 동작)); ) ) ) )

Controller 클래스에서 컨트롤러를 상속하는 경우에도 동일한 접근 방식을 적용할 수 있습니다. Execute() 메서드에서 requestContext.HttpContext.Response 속성을 읽을 때 반환되는 HttpResponseBase 클래스는 아래 예제와 같이 Controller.Response 속성을 통해 액세스할 수 있습니다. 이 클래스는 이전에 생성된 DerivedController 클래스를 확장합니다. Controller 클래스에서 상속:

시스템 사용; System.Web 사용; System.Web.Mvc 사용; 네임스페이스 ControllersAndActions.Controllers ( 공용 클래스 DerivedController: Controller ( 공용 ActionResult Index() ( // ... ) public void ProduceOutput() ( if (Server.MachineName == "ProfessorWeb") Response.Redirect("/Basic/Index" ); else Response.Write("컨트롤러: Derived, 작업 메서드: ProduceOutput"); ) ) )

ProduceOutput() 메서드는 Server.MachineName 속성 값을 사용하여 클라이언트에 보낼 응답을 결정합니다. ("ProfessorWeb"은 내 개발 컴퓨터의 이름입니다.)

사용자에 대한 응답을 생성하는 이 접근 방식은 작동하지만 몇 가지 문제가 있습니다.

    컨트롤러 클래스에는 다음에 대한 정보가 포함되어야 합니다. HTML 구조또는 URL을 사용하면 클래스를 읽고 유지하기가 어렵습니다.

    출력에 직접 응답을 생성하는 컨트롤러는 단위 테스트가 어렵습니다. Response 개체의 모의 구현을 만든 다음 컨트롤러의 출력을 처리하여 그것이 무엇인지 확인할 수 있어야 합니다. 예를 들어 이는 HTML 마크업을 다음과 같이 구문 분석해야 함을 의미할 수 있습니다. 키워드이는 길고 지루한 과정입니다.

    이러한 방식으로 각 응답의 작은 세부정보를 처리하는 것은 복잡하고 오류가 발생하기 쉽습니다. 일부 프로그래머는 낮은 수준의 컨트롤러를 구축하여 제공되는 절대적인 제어를 좋아하지만 일반적으로 이는 매우 빠르게 복잡해집니다.

다행히 MVC 프레임워크에는 이러한 모든 문제, 즉 작업 결과를 해결하는 편리한 도구가 있습니다. 다음 섹션에서는 작업 결과의 개념을 설명하고 보여줍니다. 다양한 방법컨트롤러로부터 응답을 생성하는 데 사용됩니다.

조치 결과

MVC 프레임워크의 작업 결과는 의도 진술과 의도 실행을 분리하는 데 사용됩니다. 개념을 익히면 간단해 보이지만 간접적인 부분이 있기 때문에 이해하는 데 시간이 걸립니다.

Response 개체를 직접 처리하는 대신 작업 메서드는 컨트롤러의 응답이 무엇인지 설명하는 ActionResult 파생 클래스 개체를 반환합니다. 예를 들어 뷰를 렌더링하거나 다른 URL 또는 작업 메서드로 리디렉션합니다. 그러나 (이것은 매우 간접적임) 답변이 직접 생성되지 않습니다. 대신 ActionResult 개체가 생성되며 MVC Framework는 작업 메서드가 호출된 후 결과를 생성하기 위해 처리합니다.

작업 결과 시스템은 명령 디자인 패턴의 예입니다. 이 패턴은 수행 중인 작업을 설명하는 개체를 저장하고 전달하는 시나리오를 나타냅니다.

MVC 프레임워크는 작업 메서드에서 ActionResult 개체를 받으면 다음을 호출합니다. ExecuteResult() 메서드, 이 개체의 클래스에 정의되어 있습니다. 그러면 작업 결과 구현이 Response 개체에서 작동하여 의도와 일치하는 출력을 생성합니다. 이를 실제로 시연하기 위해 인프라 폴더를 만들고 아래 예에 표시된 사용자 정의 ActionResult 구현을 사용하여 CustomRedirectResult.cs라는 새 클래스 파일을 여기에 추가해 보겠습니다.

System.Web.Mvc 사용; 네임스페이스 ControllersAndActions.Infrastructure ( 공용 클래스 CustomRedirectResult: ActionResult ( 공용 문자열 Url ( get; set; ) 공용 재정의 void ExecuteResult(ControllerContext 컨텍스트) ( 문자열 fullUrl = UrlHelper.GenerateContentUrl(Url, context.HttpContext); context.HttpContext.Response.Redirect (fullUrl); ) ) )

이 클래스는 System.Web.Mvc.RedirectResult 클래스의 작동 방식을 기반으로 합니다. 오픈 소스 MVC 프레임워크의 장점 중 하나는 모든 것의 내부 작동 방식을 탐색할 수 있다는 것입니다. CustomRedirectResult 클래스는 MVC에 비해 훨씬 간단하지만 이 기사의 목적에는 충분합니다.

RedirectResult 클래스를 인스턴스화할 때 사용자가 리디렉션되어야 하는 URL을 전달합니다. 액션 메소드가 완료되면 MVC 프레임워크에 의해 실행될 ExecuteResult() 메소드는 응답 객체프레임워크에서 제공하는 ControllerContext 개체를 통해 요청을 만들고 RedirectPermanent() 메서드 또는 Redirect() 메서드를 호출합니다(이는 기사 앞부분의 예제에 있는 하위 수준 IController 구현 내에서 수행된 작업을 정확하게 반영합니다).

CustomRedirectResult 클래스의 사용은 파생 컨트롤러에 적용된 변경 사항을 보여주는 아래 예에 설명되어 있습니다.

// ... ControllersAndActions.Infrastructure 사용; 네임스페이스 ControllersAndActions.Controllers ( 공용 클래스 DerivedController: Controller ( 공용 ActionResult Index() ( // ... ) 공용 ActionResult ProduceOutput() ( if (Server.MachineName == "MyMachineName") return new CustomRedirectResult ( Url = "/Basic/ Index" ); else ( Response.Write("컨트롤러: Derived, 작업 메서드: ProduceOutput"); return null; ) ) ) )

ActionResult를 반환하도록 작업 메서드의 결과를 변경해야 했습니다. Action 메서드가 실행될 때 MVC Framework가 아무 작업도 수행하지 않도록 하려면 null을 반환합니다. 이는 CustomRedirectResult 인스턴스가 반환되지 않은 경우 수행한 작업입니다.

단위 테스트 컨트롤러 및 작업

MVC 프레임워크의 많은 부분은 단위 테스트를 더 쉽게 만들기 위해 설계되었으며 특히 액션과 컨트롤러에 해당됩니다. 이 지원에는 여러 가지 이유가 있습니다.

웹 서버 외부에서 액션과 컨트롤러를 테스트할 수 있습니다. 컨텍스트 개체는 모의하기 쉬운 기본 클래스(예: HttpRequestBase)를 통해 액세스됩니다.

작업 메서드의 결과를 테스트하기 위해 HTML 마크업을 구문 분석할 필요가 없습니다. 예상한 결과를 얻고 있는지 확인하려면 반환된 ActionResult 개체를 검사하면 됩니다.

클라이언트 요청 에뮬레이션은 필요하지 않습니다. MVC 프레임워크의 모델 바인딩 시스템을 사용하면 해당 매개변수에 입력을 받는 작업 메서드를 작성할 수 있습니다. 작업 메서드를 테스트하려면 해당 메서드를 직접 호출하고 적절한 매개변수 값을 제공하면 됩니다.

컨트롤러에서 데이터를 생성하는 방법에 대한 향후 기사에서는 다양한 유형의 작업 결과에 대한 단위 테스트를 만드는 방법을 보여줍니다.

단위 테스트는 전체 그림의 일부일 뿐이라는 점을 잊지 마십시오. 작업 메서드가 순차적으로 호출되면 응용 프로그램의 복잡한 동작이 발생합니다. 단위 테스트는 다른 테스트 접근 방식과 결합할 때 가장 잘 작동합니다.

이제 리디렉션 작업의 특별한 결과가 어떻게 작동하는지 알았으므로 더 강력하고 Microsoft에서 철저한 테스트를 거친 MVC 프레임워크에서 제공하는 것과 동등한 것으로 전환할 수 있습니다. 파생 컨트롤러에 필요한 변경 사항은 다음과 같습니다.

// ... public ActionResult ProduceOutput() ( return new RedirectResult("/Basic/Index"); ) // ...

조건문이 작업 메서드에서 제거되었습니다. 즉, 애플리케이션을 시작하고 /Derived/ProduceOutput과 같은 URL로 이동한 후 브라우저가 /Basic/Index와 같은 URL로 리디렉션됩니다. 작업 메서드 코드를 단순화하기 위해 Controller 클래스에는 다양한 종류의 ActionResult 개체를 생성하기 위한 편리한 메서드가 포함되어 있습니다. 예를 들어 Redirect() 메서드의 결과를 반환하여 위 예제와 동일한 효과를 얻을 수 있습니다.

// ... public ActionResult ProduceOutput() ( return Redirect("/Basic/Index"); ) // ...

작업 결과 시스템에는 특별히 복잡한 것은 없지만 궁극적으로 읽기 쉽고 단위 테스트가 쉬운 더 간단하고 깨끗하며 일관된 코드를 생성하는 데 도움이 됩니다. 예를 들어 리디렉션의 경우 작업 메서드가 Url 속성에 예상 대상이 포함된 RedirectResult 인스턴스를 반환하는지 간단히 확인할 수 있습니다.

MVC 프레임워크는 아래 표에 설명된 다양한 내장 작업 결과 유형을 정의합니다.

내장 ActionResult 유형 유형 설명 Controller 클래스의 도우미 메서드
결과 보기

지정된 뷰 템플릿 또는 표준 뷰 템플릿을 렌더링합니다.

보다()
부분 보기결과

지정된 또는 표준 부분 보기 템플릿을 렌더링합니다.

부분뷰()
경로 결과로 리디렉션

문제 HTTP 리디렉션 301 또는 302를 작업 방법 또는 지정된 경로 항목에 추가하여 라우팅 구성에 따라 URL을 생성합니다.

리디렉션으로액션()
RedirectToActionPermanent()
경로로 리디렉션()
RedirectToRoutePermanent()
리디렉션결과

지정된 URL로 HTTP 301 또는 302 리디렉션을 실행합니다.

리디렉션()
리디렉션Permanent()
내용결과

형식화되지 않은 텍스트 데이터를 브라우저에 반환하고 콘텐츠 유형 헤더를 추가로 설정합니다.

콘텐츠()
파일결과

바이너리 데이터(예: 디스크의 파일 또는 메모리의 바이트 배열)를 브라우저로 직접 전송합니다.

파일()
JsonResult

.NET 개체를 직렬화합니다. JSON 형식그리고 그것을 응답으로 보냅니다. 이 유형의 응답은 Web API 및 AJAX 도구를 사용할 때 더 자주 생성됩니다.

제이슨()
JavaScript결과

조각을 보냅니다 소스 코드브라우저에서 실행해야 하는 JavaScript

자바스크립트()
HttpUnauthorizedResult

HTTP 응답 상태 코드를 401("인증되지 않음"을 의미)로 설정합니다. 그러면 인증 메커니즘(양식 인증 또는 Windows 인증)이 방문자에게 로그인하라는 메시지를 표시하게 됩니다.

아니요
HttpNotFound결과

보고 HTTP 오류코드 404 - 찾을 수 없음(찾을 수 없음)

HttpNotFound()
HttpStatusCodeResult

지정된 HTTP 코드를 반환합니다.

아니요
빈결과

아무것도하지 않고

아니요

이러한 유형은 모두 ActionResult 클래스에서 파생되며 대부분 Controller 클래스에 편리한 도우미 메서드가 있습니다. 후속 기사에서는 이러한 유형의 결과를 사용하는 방법을 보여 드리겠습니다.

요청 메시지를 수신하고 해석한 후 서버는 HTTP 응답 메시지로 응답합니다.

  • A 상태 표시줄
  • 0개 이상의 헤더(General|Response|Entity) 필드 뒤에 CRLF가 옵니다.
  • 헤더 필드의 끝을 나타내는 빈 줄(즉, CRLF 앞에 아무것도 없는 줄)
  • 선택적으로 메시지 본문
  • 다음 섹션에서는 HTTP 응답 메시지에 사용되는 엔터티를 각각 설명합니다.

    메시지 상태 표시줄

    상태 표시줄은 프로토콜 버전, 숫자 상태 코드 및 관련 텍스트 문구로 구성됩니다. 요소는 공백 SP 문자로 구분됩니다.

상태 라인 = HTTP 버전 SP 상태 코드 SP 이유 문구 CRLF HTTP 버전

HTTP 버전 1.1을 지원하는 서버는 다음 버전 정보를 반환합니다.

HTTP 버전 = HTTP/1.1

상태 코드

Status-Code 요소는 3자리 정수로, Status-Code의 첫 번째 숫자는 응답 클래스를 정의하고 마지막 두 자리는 분류 역할을 갖지 않습니다. 첫 번째 숫자에는 5개의 값이 있습니다.

S.N. 코드 및 설명
1 1xx: 정보용

이는 요청이 접수되었으며 프로세스가 계속 진행 중임을 의미합니다.

2 2xx: 성공

이는 작업이 성공적으로 수신되고 이해되었으며 수락되었음을 의미합니다.

3 3xx: 리디렉션

이는 요청을 완료하려면 추가 조치를 취해야 함을 의미합니다.

4 4xx: 클라이언트 오류

이는 요청에 잘못된 구문이 포함되어 있거나 처리할 수 없음을 의미합니다.

5 5xx: 서버 오류

이는 서버가 명백히 유효한 요청을 이행하지 못했음을 의미합니다.

HTTP 상태 코드는 확장 가능하며 HTTP 애플리케이션은 등록된 모든 상태 코드의 의미를 이해할 필요가 없습니다. 모든 상태 코드 목록은 별도의 장에 나와 있습니다. 당신을 위해참조.

응답 헤더 필드

HTTP 헤더 필드를 배울 때 General-header와 Entity-header에 대해서는 별도의 장에서 공부하겠습니다. 지금은 응답 헤더 필드가 무엇인지 확인해 보겠습니다.

응답 헤더 필드를 사용하면 서버는 상태 표시줄에 배치할 수 없는 응답에 대한 추가 정보를 전달할 수 있습니다. 이러한 헤더 필드는 서버에 대한 정보와 Request-URI로 식별된 리소스에 대한 추가 액세스에 대한 정보를 제공합니다.

  • 프록시 인증

  • WWW-인증

자신만의 사용자 정의 웹 클라이언트 및 서버를 작성하려는 경우 사용자 정의 필드를 도입할 수 있습니다.

응답 메시지의 예

이제 모든 것을 모아서 hello.htm 페이지를 가져오는 요청에 대한 HTTP 응답을 구성해 보겠습니다. 웹 서버현장에서 달리는 중

HTTP/1.1 200 OK 날짜: 2009년 7월 27일 월요일 12:28:53 GMT 서버: Apache/2.2.14 (Win32) 최종 수정: 2009년 7월 22일 수요일 19:15:56 GMT Content-Length: 88 Content- 유형: text/html 연결: 종료됨 Hello, World!

다음 예에서는 웹 서버가 요청한 페이지를 찾을 수 없을 때 오류 조건을 표시하는 HTTP 응답 메시지를 보여줍니다.

HTTP/1.1 404 찾을 수 없음 날짜: 2012년 10월 18일 일요일 10:36:20 GMT 서버: Apache/2.2.14(Win32) 콘텐츠 길이: 230 연결: 닫힘 콘텐츠 유형: text/html; charset=iso-8859-1 404 찾을 수 없음 찾을 수 없음

요청한 URL /t.html을 이 서버에서 찾을 수 없습니다.

다음은 웹 서버가 주어진 HTTP 요청에서 잘못된 HTTP 버전을 발견했을 때 오류 조건을 표시하는 HTTP 응답 메시지의 예입니다.

HTTP/1.1 400 잘못된 요청날짜: 2012년 10월 18일 일요일 10:36:20 GMT 서버: Apache/2.2.14 (Win32) 콘텐츠 길이: 230 콘텐츠 유형: text/html; charset=iso-8859-1 연결: 종료됨 400 잘못된 요청 잘못된 요청

귀하의 브라우저가 이 서버가 이해할 수 없는 요청을 보냈습니다.

요청 라인의 프로토콜 문자열 뒤에 잘못된 문자가 포함되어 있습니다.