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


1471

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

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

예외 트래핑 및 표시

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

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

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

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

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


68
입력에 HTML 엔터티 이름 (& amp;) 또는 엔터티 번호 (& # 39;)가있는 경우이 오류가 발생할 수 있습니다.
Drew Noakes

18
글쎄, 내 질문이기 때문에 실제로 포인트를 정의 할 수 있다고 생각합니다. 누군가 '<'를 입력했기 때문에 전체 응용 프로그램 프로세스가 중단되고 일반 오류 메시지가 반환됩니다. 특히 대부분의 사람들이이를 제거하기 위해 'validateRequest = false'를 사용하므로 취약점을 다시 열 것입니다.
Radu094

7
@DrewNoakes : 엔터티 이름 (& amp;)은 내 테스트 (.Net 4.0에서 테스트)에 따라 문제가되지 않는 것으로 보이지만 엔터티 번호 (& # 39;)는 유효성 검사에 실패합니다 (설명한대로). .Net Reflector를 사용하여 System.Web.CrossSiteScriptingValidation.IsDangerousString 메소드를 디스 어셈블하면 코드가 html 태그 (<로 시작) 및 엔티티 번호 (& #로 시작)를 찾습니다.
Gyum Fox

5
기본 MVC 프로젝트를 사용하여 VS2014에서 새 사이트를 생성하고 실행하십시오. 등록 링크를 클릭하고 이메일을 추가 한 다음 "<P455-0r [!" 비밀번호로. 악의적 인 작업을 시도하지 않고 동일한 오류가 발생하면 암호 필드가 표시되지 않으므로 XSS 공격이되지 않지만이를 해결하는 유일한 방법은 ValidateInput (false)을 사용하여 유효성 검사를 완전히 제거하는 것입니다. ? 이 상황에서는 AllowHtml 제안이 작동하지 않지만 여전히 같은 오류가 발생했습니다. 클라이언트에서 잠재적으로 위험한 Request.Form 값이 발견되었습니다 (Password = "<P455-0r [!").
stephenbayer

TL; DR 넣어 <httpRuntime requestValidationMode="2.0" />의 Web.config

답변:


1080

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

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

또한 "< "는 본질적으로 위험하지 않습니다. 특정 상황에서만 위험합니다 : (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 ) 에도 추가 해야 합니다.


74
늦게 오는 사람들 : validateRequest = "false"는 Page 지시문 (.aspx 파일의 첫 줄)에
갑니다

56
도움말 : <httpRuntime requestValidationMode="2.0" />나머지 사이트에서 확인하여 제공되는 유용한 보호 기능을 중단하지 않으려면 위치 태그를 넣으십시오 .
Brian

297
MVC3에서 이것은 [AllowHtml]모델 속성에 있습니다.
Jeremy Holovacs

2
를 사용하지 않으려면 전 세계적으로 MVC 3 당신은 또한 필요 GlobalFilters.Filters.Add(new ValidateInputAttribute(false));에서 Application_Start().
Alex

15
@MGOwen 당신은 또한을 통해의 Web.config에 페이지 지시문을 추가 할 수 있습니다 <pages validateRequest="false" />에서 <system.web />. 이렇게하면 속성이 모든 페이지에 적용됩니다.
oliver-clare

504

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

전체 응용 프로그램의 한 페이지에 필요할 때 문제가 발생할 수 있습니다.

3
클래스 레벨에서 [ValidateInput (false)] 속성을 추가 할 수도 있습니다. 기본 컨트롤러 클래스에 추가하면 모든 컨트롤러 메서드 작업에 적용됩니다.
Shan Plourde

@Zack 솔루션에 감사드립니다. 다른 한편 으로는 속성 즉 편집기 필드에 대해 한 번에 정의 되기 때문에 [AllowHtml]보다 나은지 궁금합니다. 사용될 때마다 여러 작업에 사용할 필요가 없습니다. 당신은 무엇을 제안합니까? ValidateInput(false)[AllowHtml]
Jack

@Zack Peterson 사용하는 것이 안전합니까? 보안 문제가 없습니까?
shrey Pav

416

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

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

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

12
컨트롤러에서보다 설득력있게하는 것이 훨씬 좋습니다!
Andiih

29
유일한 정답! 컨트롤러 작업에서 유효성 검사를 비활성화하는 것은 해킹입니다. 그리고 응용 프로그램 수준에서 유효성 검사를 비활성화하려면 개발자가 중단되어야합니다!
trailmax

MVC 4에서 사라 졌습니까?
granadaCoder

1
차이점은 무엇이며 ValidateInput(false)그리고 AllowHtml? 다른 것의 장점은 무엇입니까? 언제 AllowHtml대신에 사용하고 싶 ValidateInput(false)습니까? 언제 ValidateInput(false)이상 사용 하고 AllowHtml싶습니까? 언제 둘 다 사용하고 싶습니까? 둘 다 사용하는 것이 합리적입니까?
Ian Boyd

3
ValidateInput이 메소드에 있고 AllowHtml이 모델의 특성에 있습니다. 따라서 HTML이 아닌 것으로 예상되는 것만 허용합니다.
Anthony Johnston

213

.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"

30
<system.web>태그 내부 .
Hosam Aly

8
나는 이것을 web.config에 넣었지만 여전히 "잠재적으로 위험한 Request.Form 값"
Filip

20
<httpRuntime requestValidationMode = "2.0"/>는 2.0 프레임 워크가 시스템에 설치된 경우에만 작동합니다. 2.0 프레임 워크가 전혀 설치되지 않고 4.0 프레임 워크 만 설치된 경우 어떻게됩니까?
사무엘

이것은 완전히 나를 위해 일했습니다. 다른 답변의 단계 문서는 필요하지 않습니다 (validateRequest = "false"포함)!
tom redfern

112

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에서이를 제어하는 ​​것이 더 안전합니다.

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


: 여기에 4 | requestValidationMode = 2에 대한 자세한 정보를 원하시면 msdn.microsoft.com/en-us/library/...
GlennG

슬프게도 ASP.net 2.0에서는 그대로 작동하지 않습니다. httpRuntime 줄을 제거하면 작동합니다.
Fandango68

유효성 검사가 비활성화되면 사람들이 수동으로 입력의 유효성을 검사하도록 상기시키는 경고를 추가했습니다.
카터 메 드린

72

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

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

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

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


10
안타깝게도 MVC 3 RTW에서 제외 기능이 제거 된 것 같습니다 :(
Matt Greer

2
도 아니다 4 MVC에 포함했다
wilsjd

9
동일한 결과를 얻으려면 동작 [AllowHtml]대신 모델의 속성을 사용하십시오 [ValidateInput].
Mr

2
@Christof 내 대답은 5 살입니다. 나는 오랫동안이 문제를 겪지 않았으므로 문제를 해결하는 더 좋은 방법이있을 수 있습니다. 이 두 가지 옵션에 관해서는 귀하의 상황에 달려 있다고 생각합니다. 어쩌면 해당 모델을 두 개 이상의 동작으로 노출 할 수도 있고 HTML이 허용되는 곳도 있습니다. 이 경우 [AllowHtml]옵션이 아닙니다. weblogs.asp.net/imranbaloch/… 이 기사를 확인하는 것이 좋지만 너무 오래되어 오래된 것일 수도 있습니다.
gligoran

1
특정 메소드 매개 변수를 유효성 검사에서 제외하는 방법은 여전히 ​​있습니다. 여기에서 내 대답을 확인하십시오. stackoverflow.com/a/50796666/56621
Alex

51

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) {
    ...
}

2
나를 위해 validateRequest="false", 단지 필요하지 않았다requestValidationMode="2.0"
tom redfern

requestValidationMode = "2.0"은 여전히 ​​HTML로 인코딩 된 데이터에서 오류를 생성합니다. base64를 제외한 모든 솔루션은 모든 것을 인코딩 한 다음 함께 보냅니다.
MC9000

48

텍스트 상자 내용을 HTML로 인코딩 할 수 있지만 불행히도 예외가 발생하지는 않습니다. 내 경험상 해결할 방법이 없으므로 페이지 유효성 검사를 비활성화해야합니다. 그렇게함으로써 "나는 조심할 것이다. 약속한다."


43

MVC의 경우 다음을 추가하여 입력 유효성 검사를 무시하십시오.

[ValidateInput (false)]

컨트롤러의 각 액션 위에.


구성된 경로를 통해 컨트롤러 방법에 도달하는 경우에는 작동하지 않는 것 같습니다.
PandaWood

실제로 기술적 인 설명은 문제가되는 문자가 "쿼리 문자열"에있을 때만 작동한다는 것입니다 ... 요청 경로에 있으면 유효성 검사 속성 작동 하지 않습니다
PandaWood

42

Global.asax에서 오류를 잡을 수 있습니다. 여전히 확인하고 싶지만 적절한 메시지를 표시합니다. 아래에 나열된 블로그에서 이와 같은 샘플을 사용할 수 있습니다.

    void Application_Error(object sender, EventArgs e)
    {
        Exception ex = Server.GetLastError();

        if (ex is HttpRequestValidationException)
        {
            Response.Clear();
            Response.StatusCode = 200;
            Response.Write(@"[html]");
            Response.End();
        }
    }

다른 페이지로 리디렉션하면 예외에 대한 합리적인 응답처럼 보입니다.

http://www.romsteady.net/blog/2007/06/how-to-catch-httprequestvalidationexcep.html


40

이 질문에 대한 답은 간단합니다.

var varname = Request.Unvalidated["parameter_name"];

특정 요청에 대한 유효성 검사가 비활성화됩니다.


1
ASP.NET 4.5에만 적용됩니다 (아마도 이후에 나올 것으로 예상됩니다). 4.5 이전 버전에서는이를 지원하지 않습니다.
Beska

3
나는 이런 식으로 부딪 칠 수 있기를 바랍니다. .NET 4.5를 사용하고 있으며 MVC를 사용하지 않으므로 web.config를 변경할 수 없으므로 정확히 필요한 것입니다.
Chris Gillum

1
예. .Net 2를 사용한다면 어떨까요? 우리 중 일부는 선택의 여지가 없습니다
Fandango68

이것은 POST 또는 GET 매개 변수를 얻습니까?
max4ever

이것이 이미 발생한 예외를 방지한다고 말하고 있습니까? 또는 .net 4.5에서 실제로 데이터를 읽을 때까지 예외 및 유효성 검사를 지연 Request합니까?
ebyrob

34

일부 .NET 컨트롤은 자동으로 출력을 HTML로 인코딩합니다. 예를 들어 TextBox 컨트롤에서 .Text 속성을 설정하면 자동으로 인코딩됩니다. 즉, 구체적으로는 변환 수단 <으로 &lt;, >&gt;&&amp;. 따라서 이것을 조심하십시오 ...

myTextBox.Text = Server.HtmlEncode(myStringFromDatabase); // Pseudo code

그러나 HyperLink, Literal 및 Label의 .Text 속성은 HTML을 인코딩하지 않으므로 Server.HtmlEncode (); <script> window.location = "http://www.google.com"; </script>페이지에 출력되어 실행되는 것을 막으려면 이러한 속성에 설정되는 모든 것이 필수적 입니다.

인코딩되는 것과 인코딩되지 않은 것을 확인하기 위해 약간의 실험을 수행하십시오.


29

web.config 파일의 태그 내에 requestValidationMode = "2.0"속성이있는 httpRuntime 요소를 삽입하십시오. 또한 pages 요소에 validateRequest = "false"속성을 추가하십시오.

예:

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

1
나에게 validateRequest = "false"는 필요하지 않았다. requestValidationMode = "2.0"
tom redfern

3
"pages"섹션은 "system.web"섹션 내에 있어야합니다.
카터 메 드린

다시 한 번 위험한 대답.
MC9000

나는 둘 다 필요했다. 감사합니다
Jack

23

ValidateRequest를 비활성화하지 않으려면 예외를 피하기 위해 JavaScript 함수를 구현해야합니다. 최선의 선택은 아니지만 작동합니다.

function AlphanumericValidation(evt)
{
    var charCode = (evt.charCode) ? evt.charCode : ((evt.keyCode) ? evt.keyCode :
        ((evt.which) ? evt.which : 0));

    // User type Enter key
    if (charCode == 13)
    {
        // Do something, set controls focus or do anything
        return false;
    }

    // User can not type non alphanumeric characters
    if ( (charCode <  48)                     ||
         (charCode > 122)                     ||
         ((charCode > 57) && (charCode < 65)) ||
         ((charCode > 90) && (charCode < 97))
       )
    {
        // Show a message or do something
        return false;
    }
}

그런 다음 코드 뒤의 PageLoad 이벤트에서 다음 코드를 사용하여 속성을 컨트롤에 추가하십시오.

Me.TextBox1.Attributes.Add("OnKeyPress", "return AlphanumericValidation(event);")

4
이렇게하면 앱이 메이크업 POST 요청으로부터 여전히 취약 해집니다. 일반 사용자는, : 또는 따옴표와 같은 문자를 입력하는 데 문제가 있지만 일반 해커는 잘못된 데이터를 서버에 게시하는 데 아무런 문제가 없습니다. 나는이 waaay를 표명했다.
Radu094

13
@ Radu094 :이 솔루션을 사용하면 ValidateRequest = true를 유지할 수 있습니다. 이는 해커가 여전히 그 벽에 부딪 칠 것이라는 의미입니다. ValidateRequest를 끄는 것보다 덜 취약하므로 투표하십시오.
jbehren

21

아직 아래에 언급 한 사람이없는 것 같지만 문제가 해결되었습니다. 그리고 누군가 말하기 전에 Visual Basic ... yuck입니다.

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Example.aspx.vb" Inherits="Example.Example" **ValidateRequest="false"** %>

단점이 있는지 모르겠지만 저에게는 놀라운 일이었습니다.


웹 양식 c # 또는 VB에 적용
TheAlbear

19

또 다른 해결책은 다음과 같습니다.

protected void Application_Start()
{
    ...
    RequestValidator.Current = new MyRequestValidator();
}

public class MyRequestValidator: RequestValidator
{
    protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
    {
        bool result = base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);

        if (!result)
        {
            // Write your validation here
            if (requestValidationSource == RequestValidationSource.Form ||
                requestValidationSource == RequestValidationSource.QueryString)

                return true; // Suppress error message
        }
        return result;
    }
}

좋은! Request Validator를 교체 할 수있는 능력을 알지 못했습니다. "ok"라고 말하지 않고 "_NoValidation"으로 끝나는 필드를 이름으로 확인하지 않도록이 아이디어를 확장했습니다. 아래 코드
Walden Leverich

Walden Leverich,이를 위해 [AllowHtml] 속성
Sel

예, MVC 환경에서 작동합니다. 그러나 webforms 응용 프로그램에는이를 수행 할 모델이 없습니다. :-)
Walden Leverich

15

프레임 워크 4.0을 사용하는 경우 web.config의 항목 (<pages validateRequest = "false"/>)

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

프레임 워크 4.5를 사용하는 경우 web.config의 항목 (requestValidationMode = "2.0")

<system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" requestValidationMode="2.0"/>
</system.web>

단일 페이지 만 원한다면 aspx 파일에서 첫 번째 줄을 다음과 같이 넣어야합니다.

<%@ Page EnableEventValidation="false" %>

이미 <% @ Page와 같은 것이 있으면 나머지 => EnableEventValidation="false"%>를 추가하십시오.

나는 그것을하지 않는 것이 좋습니다.


13

ASP.NET에서는 친숙한 메시지를 표시하거나 다른 페이지로 리디렉션하는 등 예외를 포착하고 이에 대해 무언가를 수행 할 수 있습니다 ... 또한 직접 검증을 처리 할 수있는 가능성이 있습니다 ...

친숙한 메시지 표시 :

protected override void OnError(EventArgs e)
{
    base.OnError(e);
    var ex = Server.GetLastError().GetBaseException();
    if (ex is System.Web.HttpRequestValidationException)
    {
        Response.Clear();
        Response.Write("Invalid characters."); //  Response.Write(HttpUtility.HtmlEncode(ex.Message));
        Response.StatusCode = 200;
        Response.End();
    }
}

13

모듈에서 할 수 있다고 생각합니다. 그러나 그것은 몇 가지 질문을 열어 놓았습니다. 입력을 데이터베이스에 저장하려면 어떻게해야합니까? 갑자기 인코딩 된 데이터를 데이터베이스에 저장하기 때문에 입력을 신뢰하게되는데 이는 아마도 잘못된 생각 일 것입니다. 인코딩되지 않은 원시 데이터를 데이터베이스에 저장하고 매번 인코딩하는 것이 이상적입니다.

페이지 수준에서 보호를 비활성화 한 다음 매번 인코딩하는 것이 더 나은 옵션입니다.

Server.HtmlEncode를 사용하는 대신 Microsoft ACE 팀 의보다 새롭고 완전한 Anti-XSS 라이브러리 를 살펴 봐야합니다 .


12

원인

기본적으로 ASP.NET은 XSS ( Cross-Site Scripting ) 및 SQL 삽입으로 이어질 수있는 잠재적으로 안전하지 않은 내용에 대해 모든 입력 컨트롤의 유효성을 검사합니다. . 따라서 위의 예외를 throw하여 해당 내용을 허용하지 않습니다. 기본적으로이 점검이 각 포스트 백에서 발생하도록하는 것이 좋습니다.

해결책

대부분의 경우 리치 텍스트 상자 또는 리치 텍스트 편집기를 통해 HTML 컨텐츠를 페이지에 제출해야합니다. 이 경우 @Page지시문 의 ValidateRequest 태그 를 false 로 설정하여이 예외를 피할 수 있습니다 .

<%@ Page Language="C#" AutoEventWireup="true" ValidateRequest = "false" %>

그러면 ValidateRequest 플래그를 false로 설정 한 페이지에 대한 요청 유효성 검사가 비활성화됩니다. 이 기능을 비활성화하려면 웹 응용 프로그램 전체를 확인하십시오. web.config <system.web> 섹션에서 false로 설정해야합니다.

<pages validateRequest ="false" />

.NET 4.0 이상의 프레임 워크의 경우 위의 작업을 수행하려면 <system.web> 섹션에 다음 줄을 추가해야합니다.

<httpRuntime requestValidationMode = "2.0" />

그게 다야. 위의 문제를 해결하는 데 도움이되기를 바랍니다.

참조 : ASP.Net 오류 : 클라이언트에서 잠재적으로 위험한 Request.Form 값이 발견되었습니다.


10

JavaScript를 사용하여 데이터를 인코딩하는 솔루션을 찾았습니다.이 데이터는 .NET에서 디코딩되며 jQuery가 필요하지 않습니다.

  • 텍스트 상자를 ASP 대신 HTML 요소 (예 : 텍스트 영역)로 만듭니다.
  • 숨겨진 필드를 추가하십시오.
  • 헤더에 다음 JavaScript 함수를 추가하십시오.

    함수 boo () {targetText = document.getElementById ( "HiddenField1"); sourceText = document.getElementById ( "사용자 박스"); targetText.value = 이스케이프 (sourceText.innerText); }

텍스트 영역에 boo ()를 호출하는 onchange를 포함하십시오.

<textarea id="userbox"  onchange="boo();"></textarea>

마지막으로 .NET에서

string val = Server.UrlDecode(HiddenField1.Value);

나는 이것이 단방향이라는 것을 알고 있습니다. 양방향이 필요하다면 창의력을 가져야하지만 web.config를 편집 할 수없는 경우 해결책을 제공합니다

다음은 jQuery를 통해 사용 된 예제 I (MC9000)입니다.

$(document).ready(function () {

    $("#txtHTML").change(function () {
        var currentText = $("#txtHTML").text();
        currentText = escape(currentText); // Escapes the HTML including quotations, etc
        $("#hidHTML").val(currentText); // Set the hidden field
    });

    // Intercept the postback
    $("#btnMyPostbackButton").click(function () {
        $("#txtHTML").val(""); // Clear the textarea before POSTing
                               // If you don't clear it, it will give you
                               // the error due to the HTML in the textarea.
        return true; // Post back
    });


});

그리고 마크 업 :

<asp:HiddenField ID="hidHTML" runat="server" />
<textarea id="txtHTML"></textarea>
<asp:Button ID="btnMyPostbackButton" runat="server" Text="Post Form" />

이것은 잘 작동합니다. 해커가 JavaScript를 우회하여 게시하려고하면 오류가 표시됩니다. 이 모든 데이터를 데이터베이스에 인코딩 한 다음 서버 측에서 이스케이프 해제하고 다른 곳에서 표시하기 전에 공격을 구문 분석 및 확인할 수 있습니다.


이것은 좋은 해결책입니다. 그것은 그것을 직접 제어하고 전체 웹 사이트 또는 페이지를 무효화하지 않는 적절한 수동 방법입니다
Fandango68

텍스트 영역에 ASP.Net 컨트롤이 아닌 HTML 태그를 사용하고 (즉 runat = "server"없음) 숨겨진에 ASP.Net 숨겨진 컨트롤을 사용하십시오. 이것은 내가 타협하지 않고 본 최고의 솔루션입니다. 당연히 서버 측에서 XSS, SQL 인젝션에 대한 데이터를 파싱하려고하지만 적어도 HTML을 게시 할 수 있습니다
MC9000

escape(...)시간이 오래 걸릴 수 있습니다. 필자의 경우 마크 업은 전체 (2MB) XML 파일이었습니다. "당신은 왜 사용하지 <input type="file"...
The Red Pea

10

여기에있는 다른 솔루션은 훌륭하지만, 특히 적절한 크기의 사이트에 100 개가 넘는 모델이있는 경우 모든 단일 모델 속성에 [AllowHtml]을 적용해야하는 것은 엄청나게 큰 고통입니다.

저와 같이이 사이트 전체 에서이 (IMHO 꽤 무의미한) 기능을 끄고 싶다면 기본 컨트롤러에서 Execute () 메서드를 재정의 할 수 있습니다 (기본 컨트롤러가없는 경우 직접 만들 것을 제안합니다. 일반적인 기능을 적용하는 데 매우 유용합니다).

    protected override void Execute(RequestContext requestContext)
    {
        // Disable requestion validation (security) across the whole site
        ValidateRequest = false;
        base.Execute(requestContext);
    }

사용자 입력에서 가져온보기로 펌핑 된 모든 것을 HTML 인코딩해야합니다 (어쨌든 Razor가있는 ASP.NET MVC 3의 기본 동작이므로 어떤 기괴한 이유로 Html.Raw ()를 사용하지 않는 한 이 기능이 필요하지 않습니다.


9

이 오류도 발생했습니다.

필자의 경우 사용자 á는 역할 이름에 ASP.NET 멤버 자격 공급자와 관련하여 강조 문자 를 입력했습니다 .

역할 이름을 메소드에 전달하여 사용자에게 해당 역할을 부여하고 $.ajax게시 요청이 비참하게 실패했습니다 ...

문제를 해결하기 위해이 작업을 수행했습니다.

대신에

data: { roleName: '@Model.RoleName', users: users }

이 작업을 수행

data: { roleName: '@Html.Raw(@Model.RoleName)', users: users }

@Html.Raw 트릭을했다.

역할 이름을 HTML 값으로 가져 왔습니다 roleName="Cadastro b&#225;s". HTML 엔터티 &#225;가있는 이 값 은 ASP.NET MVC에 의해 차단되었습니다. 이제 roleName매개 변수 값을 그대로 유지하면 roleName="Cadastro Básico"ASP.NET MVC 엔진이 더 이상 요청을 차단하지 않습니다.


9

당신이 정말로 같은 특수 문자가 필요하면 페이지 유효성 검사를 해제 >, <등 그리고 사용자 입력이 표시 될 때, 데이터가 HTML로 인코딩 된 것을 확인합니다.

페이지 유효성 검사에 보안 취약점이 있으므로 무시할 수 있습니다. 또한 페이지 유효성 검사에만 의존해서는 안됩니다.

참조 : http://web.archive.org/web/20080913071637/http://www.procheckup.com:80/PDFs/bypassing-dot-NET-ValidateRequest.pdf


링크가 끊어졌습니다.
Peter Mortensen

7

JavaScript의 이스케이프 (문자열) 함수를 사용하여 특수 문자를 바꿀 수도 있습니다 . 그런 다음 서버 측은 서버를 사용합니다. 다시 전환하려면 URLDecode (string) 입니다.

이렇게하면 입력 유효성 검사를 해제 할 필요가 없으며 문자열에 HTML 내용이있을 수 있다는 것이 다른 프로그래머에게 더 분명합니다.


7

각 포스트 백 전에 JavaScript를 사용하여 원하지 않는 문자를 확인했습니다.

<asp:Button runat="server" ID="saveButton" Text="Save" CssClass="saveButton" OnClientClick="return checkFields()" />

function checkFields() {
    var tbs = new Array();
    tbs = document.getElementsByTagName("input");
    var isValid = true;
    for (i=0; i<tbs.length; i++) {
        if (tbs(i).type == 'text') {
            if (tbs(i).value.indexOf('<') != -1 || tbs(i).value.indexOf('>') != -1) {
                alert('<> symbols not allowed.');
                isValid = false;
            }
        }
    }
    return isValid;
}

내 페이지는 대부분 데이터 입력이며 포스트 백을 수행하는 요소는 거의 없지만 최소한 데이터는 유지됩니다.


작은 괄호 대신 큰 괄호가 있어야합니다. `if (tbs (i) .type == 'text') {`대신`if (tbs [i] .type == 'text') {`
Shilpa Soni

5

다음과 같은 것을 사용할 수 있습니다.

var nvc = Request.Unvalidated().Form;

나중에 nvc["yourKey"]작동합니다.


감사합니다, 당신의 대답은 많은 시간을 절약했습니다
habib

4

한은이있는 그대로 "<"와 ">"(이 아닌 큰 따옴표 자체가) 문자 및 <입력 값 = "같은 맥락에서 그들을 사용하고 "/>, 당신이 이제 안전 (잠시 동안 <텍스트 영역 > 이것은 </ textarea>입니다. 물론 취약 할 것입니다). 그게 당신의 상황을 간단하게,하지만 대한 수 있습니다 아무것도 이상의 다른 게시 된 솔루션 중 하나를 사용하십시오.


4

<및>를 사용하지 말라고 사용자에게 알리려면 전체 양식을 처리 / 게시 (및 모든 입력 내용을 잃어 버리기)하기 전에 미리 입력 할 수는 없습니다. 필드 주변의 유효성 검사기 (또는 잠재적으로 위험한 다른 문자)를 선별합니까?


게시물 "유효성 검사기"제발
mxmissile

4

어떤 제안도 나를 위해 일하지 않았습니다. 99 %의 시간 동안 사용자가 웹 양식에 HTML을 배치하는 것을 원하지 않기 때문에 전체 웹 사이트에서이 기능을 끄고 싶지 않았습니다. 이 특정 응용 프로그램을 사용하는 유일한 사람이기 때문에 방금 자체 해결 방법을 만들었습니다. 코드 뒤에서 입력을 HTML로 변환하여 데이터베이스에 삽입합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.