[asp.net] 클라이언트에서 잠재적으로 위험한 Request.Form 값이 발견되었습니다.

사용자 가 내 웹 응용 프로그램에 포함 <되거나 >페이지에 무언가를 게시 할 때 마다이 예외가 발생합니다.

누군가 텍스트 상자에 문자를 입력했기 때문에 예외를 던지거나 전체 웹 응용 프로그램이 충돌하는 영리함에 대한 토론에 가고 싶지 않지만이를 처리하는 우아한 방법을 찾고 있습니다.

예외 트래핑 및 표시

오류가 발생했습니다. 돌아가서 전체 양식을 다시 입력하십시오. 이번에는 <

나에게는 전문적이지 않은 것 같습니다.

사후 검증 ( validateRequest="false")을 비활성화 하면이 오류를 피할 수 있지만 페이지는 여러 가지 공격에 취약합니다.

이상적으로 : HTML 제한 문자가 포함 된 포스트 백이 발생하면 양식 컬렉션에 게시 된 값이 자동으로 HTML 인코딩됩니다. .Text내 텍스트 상자 의 속성은something & lt; html & gt;

처리기에서이 작업을 수행 할 수있는 방법이 있습니까?



답변

게시 된 모든 데이터를 인코딩하여 잘못된 각도에서 공격하고 있다고 생각합니다.

< “는 데이터베이스 필드, 구성, 파일, 피드 등과 같은 다른 외부 소스에서도 발생할 수 있습니다.

또한 “< “는 본질적으로 위험하지 않습니다. 특정 상황에서만 위험합니다 : (XSS로 인해) HTML 출력으로 인코딩되지 않은 문자열을 쓸 때.

다른 상황에서는 다른 하위 문자열이 위험합니다. 예를 들어 사용자가 제공 한 URL을 링크에 쓰면 하위 문자열 ” javascript:“이 위험 할 수 있습니다. 반면에 작은 따옴표 문자는 SQL 쿼리에서 문자열을 보간 할 때 위험하지만 양식에서 제출되거나 데이터베이스 필드에서 읽은 이름의 일부인 경우 완벽하게 안전합니다.

결론은 위험한 문자에 대해 임의의 입력을 필터링 할 수 없다는 것입니다. 올바른 상황에서 문자가 위험 할 수 있기 때문입니다. 일부 특정 문자는 특별한 의미가있는 다른 하위 언어로 넘어 가기 때문에 위험 할 수있는 지점에서 인코딩해야합니다. HTML에 문자열을 쓸 때는 Server.HtmlEncode를 사용하여 HTML에 특별한 의미가있는 문자를 인코딩해야합니다. 문자열을 동적 SQL 문에 전달하는 경우 다른 문자를 인코딩해야합니다 (또는 더 나은 경우에는 준비된 명령문 등을 사용하여 프레임 워크에서이를 수행하도록하십시오).

당신이 HTML로 문자열을 통과 어디서나 당신은 당신이 HTML 인코딩이며, 다음 설정 validateRequest="false"<%@ Page ... %>당신의 지시어 .aspx파일 (들).

.NET 4에서는 조금 더해야 할 수도 있습니다. 때로는 <httpRuntime requestValidationMode="2.0" />web.config ( reference ) 에도 추가 해야 합니다.


답변

ASP.NET MVC를 사용하는 경우이 오류에 대한 다른 해결책이 있습니다.

C # 샘플 :

[HttpPost, ValidateInput(false)]
public ActionResult Edit(FormCollection collection)
{
    // ...
}

Visual Basic 샘플 :

<AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _
Function Edit(ByVal collection As FormCollection) As ActionResult
    ...
End Function


답변

ASP.NET MVC (버전 3부터 시작)에서는 AllowHtml모델의 속성에 속성을 추가 할 수 있습니다 .

속성에 대한 요청 유효성 검사를 건너 뛰어 모델 바인딩 중에 요청에 HTML 태그를 포함 할 수 있습니다.

[AllowHtml]
public string Description { get; set; }


답변

.NET 4.0을 사용 하는 경우 태그 내의 web.config 파일에 이를 추가하십시오 <system.web>.

<httpRuntime requestValidationMode="2.0" />

.NET 2.0에서 요청 유효성 검사는 요청에만 적용됩니다 aspx. .NET 4.0에서는 모든 요청 을 포함하도록 확장되었습니다 . 다음 을 지정하여 처리 할 때 XSS 유효성 검증 수행 하도록 되돌릴 수 있습니다 .aspx.

requestValidationMode="2.0"

다음 을 지정하여 요청 유효성 검사를 완전히 비활성화 할 수 있습니다 .

validateRequest="false"


답변

ASP.NET 4.0의 경우 요소 전체에 배치하여 전체 사이트 대신 특정 페이지에 대한 입력으로 마크 업을 허용 할 수 있습니다 <location>. 이렇게하면 다른 모든 페이지가 안전합니다. ValidateRequest="false".aspx 페이지 에 넣을 필요는 없습니다 .

<configuration>
...
  <location path="MyFolder/.aspx">
    <system.web>
      <pages validateRequest="false" />
      <httpRuntime requestValidationMode="2.0" />
    </system.web>
  </location>
...
</configuration>

사이트 수준에서 어떤 페이지를 입력으로 마크 업할 수 있는지 알 수 있으므로 web.config에서이를 제어하는 ​​것이 더 안전합니다.

요청 유효성 검사가 비활성화 된 페이지에서 입력을 프로그래밍 방식으로 확인해야합니다.


답변

이전 답변은 훌륭하지만 아무도 단일 필드를 HTML / JavaScript 주입에 대해 유효성 검증하지 못하게하는 방법을 말한 사람은 없습니다. 이전 버전에 대해서는 모르지만 MVC3 베타에서는 다음과 같이 할 수 있습니다.

[HttpPost, ValidateInput(true, Exclude = "YourFieldName")]
public virtual ActionResult Edit(int id, FormCollection collection)
{
    ...
}

여전히 제외 된 필드를 제외한 모든 필드의 유효성을 검사합니다. 이것에 대한 좋은 점은 유효성 검사 속성이 여전히 필드의 유효성을 검사하지만 “클라이언트에서 잠재적으로 위험한 Request.Form 값이 발견되었습니다”예외를 얻지 못한다는 것입니다.

나는 이것을 정규 표현식의 유효성을 검사하는 데 사용했습니다. 정규 표현식이 유효한지 확인하기 위해 자체 ValidationAttribute를 만들었습니다. 정규 표현식은 스크립트처럼 보이는 것을 포함 할 수 있기 때문에 위의 코드를 적용했습니다. 정규 표현식은 여전히 ​​유효한지 여부를 확인하고 있지만 스크립트 나 HTML을 포함하고 있는지 확인하지는 않습니다.


답변

ASP.NET MVC에서는 web.config에서 requestValidationMode = “2.0”및 validateRequest = “false”를 설정하고 컨트롤러 작업에 ValidateInput 특성을 적용해야합니다.

<httpRuntime requestValidationMode="2.0"/>

<configuration>
    <system.web>
        <pages validateRequest="false" />
    </system.web>
</configuration>

[Post, ValidateInput(false)]
public ActionResult Edit(string message) {
    ...
}