문제

모든 사용자가 게시물을 무언가를 포함하는 <> 에서 페이지에서 내 웹 응용 프로그램,내가 이 예외가 발생합니다.

내가 가고 싶어하지 않으로 토론에 대한 멋의 예외를 발생시키거나에 충돌이 전체 웹 응용 프로그램이기 때문에 누군가가 입력 문자를 텍스트 상자에서 그러나 내가 찾는 것은 우아하게 처리하는 방법이다.

트랩을 제외하고 보여주

오류가 발생한시 돌아와 다시 입력하고 전체 형상을 다시지만,이번에 사용하지 마십시오 <

보이지 않는 전문가에 충분하다.

용 후 유효성 검사(validateRequest="false" 는)확실히 이 오류가 발생하지 않도록 하지만,그것은이 페이지에 취약하의 번호 공격입니다.

이상적으로:게시물이 다시 발생을 포함하는 HTML 제한되는 문자,는 게시된 값 양식에서 컬렉션을 자동으로 HTML 로 인코딩됩니다.그래서 .Text 시설 내 텍스트 상자가 될 것입니다 something & lt; html & gt;

는 방법이 있을 할 수 있에서 이 핸들러?

도움이 되었습니까?

해결책

나는 당신을 공격에서 그것은 잘못된 각하고 인코딩하는 게시된 모든 데이터입니다.

Note"<"수 있도에서 오는 다른 외부 소스를 같이,데이터베이스 분야,구성,파일,공급 및니다.

또한,"<"하지 않은 본질적으로 위험합니다.그것은 단지에서 위험의 특정 context:을 작성할 때 문자열되지 않은 인코딩을 HTML 을 출력하기 때문에(의 XSS).

다른 컨텍스트에서는 다양한 하위 문자열은 위험하다,예를 들어,당신이 쓰는 경우에는 사용자가 제공하는 URL 으로 링크,하위 문자열"javascript:"위험할 수 있습니다.작은 따옴표 문자 다른 한편으로는 것은 위험할 때 문자열을 보간에서 SQL 쿼리,하지만 완벽하게 안전하다면 그것은 이름의 일부를 제출된 형태로부터 또는 데이터베이스에서 읽어들이다.

하단 라인:당신이터를 필터링할 수 없습니다 임의의 입력에 대한 위험한 캐릭터이기 때문에,어떤 문자가 위험할 수 있습니다에서 오른쪽 상황이다.당신이해야한 인코딩을 지점에는 몇 가지 특정 문자가 될 수 있기 때문에 그들은 십자가 다른 서브의 언어들이 특별한 의미를 갖습니다.을 작성할 때 문자열을 HTML,당신은 인코딩 특별한 의미를 갖는 문자에서 HTML 을 사용하는 서버입니다.HtmlEncode.당신이 문자열을 전달하는 동적으로 SQL 문을,당신은 인코딩 서로 다른 문자(또는 나이트 프레임워크는 당신을 위해 그것을 할 사용하여 준비된 문 또는 다음과 같)..

당신은 HTML 인코딩을 사방이 문자열을 전달하는 HTML,다음 설정 validateRequest="false"<%@ Page ... %> 지시어에 .aspx 파일(s).

습니다.순 4 을 할 필요가 있습니다.때때로 그것이 필요하도 추가 <httpRuntime requestValidationMode="2.0" /> 웹.config(reference).

다른 팁

서로 다른 솔루션을 이 오류는 당신이 사용하는 경우 ASP.NET MVC:

C#예제:

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

Visual 기본적인 샘플:

<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; }

는 경우에 당신은에 있습니다.NET4.0 을 추가 확인하이에서 당신의 웹.config 파일 <system.web> 태그:

<httpRuntime requestValidationMode="2.0" />

습니다.NET2.0,유효성 검증 요청에만 적용됩 aspx 요청합니다.습니다.NET4.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>

그것이 더 안전하 제어이 내부 웹.config,을 볼 수 있기 때문에 사이트 수준에서 어떤 페이지도록 허용 태그 입력으로 사용합니다.

당신은 여전히 필요한 프로그래밍 방식으로 확인 입력에 페이지를 요청 유효성 검증에 사용할 수 없습니다.

이전 답변은 좋은,하지만 아무도 말했다하는 방법을 제외 하나의 분야에서 검증을 위해 HTML/자바스크립트입니다.지가 이전 버전하지만,MVC3 베타를 할 수 있습니다:

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

이것은 여전히 유효성을 검사하는 모든 분야를 제외하고는 제외 하나입니다.에 대한 좋은 점이는 당신의 유효성 여전히 유효성을 검증 분야,하지만 당신을 얻을 하지 않"잠재적으로 위험한 요청을 합니다.형태로 값을 발견되었는 클라이언트에서"예외가 있습니다.

내가 사용했던 이 유효성 검사에 대한 정기적 표현이다.나는 내 자신의 ValidationAttribute 하시면 정규표현식은 유효하지 않습니다.정규 표현식으로 포함될 수 있습 보이는 것 같은 스크립트가 위의 코드는 정규표현식은 여전히 확인되는 경우 그것은 유효하지 않지만,포함하는 경우 스크립트나 HTML.

에 ASP.NET MVC 을 설정해야 합 requestValidationMode="2.0"validateRequest="false"web.config,그리고 적용 ValidateInput 특성을 컨트롤러 행동:

<httpRuntime requestValidationMode="2.0"/>

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

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

HTML 인코딩 텍스트 상자가 콘텐츠를,그러나 불행하게도 멈추지 않을 것을 제외에서 일어나고 있다.내 경험에 방법이 없고,주위 사용하지 않도록 할 페이지 유효성 검사를 수행합니다.하는 당신은 말하기:"내가 조심해야 할 것이다,나는 약속입니다."

MVC,무시 입력을 검증하여 추가

[ValidateInput(false)]

위의 각 활동에서 컨트롤러입니다.

당신이 잡을 수 있습하는 오류입니다.맨.아직도 유효성을 검증하려,하지만 보여 적절한 메시지입니다.블로그에 아래 샘플은 다음과 같이 사용할 수 있었습니다.

    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

이 질문에 대답은 간단하다:

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

이 비활성화에 대한 유효성 검사 특정 요청을 합니다.

는 것을 명심하시기 바랍니다.NET 컨트롤 것이 자동으로 HTML 인코딩합니다.예를 들어,설정이다.텍스트 객실에는 TextBox 컨트롤 것이 자동으로 인코딩니다.이 명시적으로 변환 <&lt;, >&gt;&&amp;.그래서 조심해야 하는 이...

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

그러나.텍스트의 속성에 대한 하이퍼링크,리터럴 및 라벨지 않습 HTML 인코딩하는 것,그래서 포장 Server.HtmlEncode();주위에 아무것도 설정에 이러한 특성입을 방지하려면 <script> window.location = "http://www.google.com"; </script> 에서 출력되는 당신의 페이지고 이후에 실행됩니다.

작은 실험하는 무엇이 인코딩 및 무엇을 하지 않습니다.

웹.config 파일에서 태그를 삽입하 httpRuntime 요소의 특성과 requestValidationMode="2.0".또한 추가 validateRequest="false"속성에서 페이지를 요소입니다.

예제:

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

원하지 않는 경우에는 사용 ValidateRequest 를 구현하는 데 필요한 자바스크립트 기능을 피하기 위해서는 예외입니다.그것이 최선의 선택이지만,그것은 작동합니다.

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);")

우리가 언급했 아래에 아직 있지만,그 문제를 수정합니다.과하기 전에 사람이 말한 그것은 Visual Basic...좀.....

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

몰가 있으면 단점이지만 나를 위해 이 놀라운 있습니다.

다른 해결책입니다:

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;
    }
}

를 사용하는 경우 framework4.0 다음 항목입니다.config(<pages validateRequest="false" />)

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

를 사용하는 경우 framework4.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" %>

이미 있는 경우 같은 뭔가 <%@페이지 그래서 그냥 나머지 부분을 추가=> EnableEventValidation="false" %>

나지 않는 것이 좋습니다 그것을 할 수 있습니다.

에 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();
    }
}

나는 당신이 그것을 할 수 있는 모듈에서;하지만 몇 가지 질문을 활짝 열어놓았습니;무엇을 저장하려면 입력된 데이터베이스?갑자기 때문에 당신이 절약 로 인코딩된 데이터를 데이터베이스를 끝까지 신뢰 입력에서 그것은 나쁜 생각이 아니다.이상적으로 저장 원시 데이터 인코딩되지 않은 데이터베이스에서 인코딩합니다.

용 보호에 페이지 수준의 인코딩 한 다음 각 시간이 더 나은 선택이 될 것입니다.

보를 사용하여 서버입니다.HtmlEncode 을 봐야 하는 새로운,더 완벽한 Anti-XSS 라이브러리 에서는 Microsoft 에이스 팀이 있습니다.

내가 찾는 솔루션을 사용한 자바 스크립트를 인코딩하는 데이터를 디코딩합니다.NET(가 필요하지 않 jQuery).

  • 을 textbox HTML 요소(과 같은 텍스트 영역)를 대신의 ASP 하나입니다.
  • 추가 숨겨져 필드입니다.
  • 다음을 추가 자바스크립트 함수의 헤더가 있습니다.

    기능 boo(){ targetText=document.getElementById("HiddenField1");sourceText=document.getElementById("userbox");targetText.value=escape(sourceText.innerText);}

에서 당신의 텍스트 영역,을 포함 onchange 는 통화 부():

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

마지막으로,습니다.물,사용

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

내가 알고 있는 것이 하나의 방법이 필요한 경우 양 당신을 얻어야 할 것이 창의적이지만,이 솔루션을 제공할 수 없는 경우 편집니다.config

여기에 예를 들어(MC9000)와서 사용을 통해 jQuery:

$(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" />

이 위대한 작동합니다.해커가려고 시도하는 게시물을 통해 우회 자바스크립트,그들은 그들은 단지 참조 오류가 있습니다.저장할 수 있습니다 이 모든 데이터의 인코딩된 데이터베이스에서뿐만 아니라,다음 unescape(그 서버에서쪽),구문 분석 및 확인에 대한 공격을 표시하기 전에 다른 곳에서.

원인

ASP.NET 기본적으로 모든 입력에 대한 컨트롤을 잠재적으로 안전하지 않은 내용으로 이어질 수 있는 교차 사이트 스크립팅 (XSS)및 SQL 주사.따라서 그것을 허용하지 않은 콘텐츠를 던져 위의 예외는 아니다.기본적으로 그것을 권장 이를 허용하려면 체크에서 발생하는 각하십시오

솔루션

많은 경우에 당신을 제출해야 HTML 콘텐츠를 귀하의 페이지를 통해 풍부한 텍스트 또는 풍부한 텍스트 편집기입니다.이 경우 당신은 피할 수 있는 이 예외 설정하여 ValidateRequest 태그 @Page 지시어를 거짓입니다.

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

이 설정의 유효성 검증 요청한 페이지를 설정 ValidateRequest 플래그를 거짓입니다.하려면 이를 비활성화하려면 체크인 통하여 웹 응용 프로그램당신은 그것을 설정해야하는 거짓에서 당신의 웹입니다.config <system.web> 섹션

<pages validateRequest ="false" />

습니다.NET4.0 이상 프레임워크해야 합니다 또한 추가 다음 줄에서 <system.web> 섹션을 같이 작동합니다.

<httpRuntime requestValidationMode = "2.0" />

그것입니다.이 도움이 되었으면 좋겠습니다 당신의 제거에는 위의 문제입니다.

참조: ASP.Net 오류:잠재적으로 위험한 요청을 합니다.형태로 값을 발견했에서 클라이언트

다른 솔루션을 여기에는 좋은,그러나 그것은 약간의 로얄에 적용해야[AllowHtml]하는 모든 단일 모델 속성이 있는 경우에 특히 100 모델에서 나중에 다시 시도해 주세이다.

나 같은 경우,당신은 이것을 설정(이럴 매우 의미가)기능의 오프 사이트를 무시할 수 있습 Execute()메소드에서 당신의 기본 컨트롤러(지 않는 경우에는 이미 기본 컨트롤러 나는 당신이 만들 하나,그들이 될 수 있습니다 아주 유용한 적용에 대한 일반적인 기능).

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

그냥 있는지 확인 HTML 인코딩 모든 것 양수되는 전망에서 온 사용자 입력을(기본 행동 ASP.NET MVC3 면도기 어쨌든 그렇지 않으면 일부상한 이유로 당신은 당신을 사용하여 Html.Raw()당신이 필요하지 않습니다 이 기능이 있습니다.

었고 너무 오류가 발생되었습니다.

내 경우에는 사용자가 입력한 악센트가 캐릭터 á 에서 역할 이름(에 관한 ASP.NET 회원 provider).

로 전달하는 역할 이름을 메서드를 사용자에게 부여하는 역할과 $.ajax post 요청이 실패하는 비참하게...

저는 이 문제를 해결하기:

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 엔진지 않는 요청을 더 이상입니다.

비활성화 페이지 검증하는 경우 당신은 정말 필요한 특별한 문자와 같이, >, , <, 니다,등등.그는지 확인할 때 사용자 입력이 표시되고,데이터는 HTML 로 인코딩됩니다.

가 있는 보안 취약점으로 페이지 검증 수 있습니다 그래서 무시했습니다.또한 페이지 검증 수 없는 전적으로 의존했다.

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

당신은 또한 자바 스크립트를 사용의 탈출(문자열) 능을 대체하는 특별한 문자입니다.그런 다음 서버의 측면을 사용하여 서버입니다.URLDecode(문자열) 하는 스위치입니다.

이 방법은 없을 끄 입력을 검증하고 수명을 다른 프로그래머는 문자열 수 있습 HTML content.

I ended up 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;
}

여 나의 페이지를 주로 데이터 입력,그리고 거기에 매우 몇 가지 요소는 다시 게시,하지만 적어도 그들의 데이터가 유지됩니다.

만큼 이들은 "<"와">"(아닌 더블 견적을 자체는)문자와 당신은 그들을 이용 상황에서 같은 "/>,당신은 안전(동안에 대한 <textarea></textarea> 당신은 것입 취약의 코스).할 수 있는 간소화하는 상황이지만, 아무것도 더 많은 중 하나를 사용하여 다른 게시된 솔루션입니다.

당신이 찾고 말하는 사용자 < 과>는 사용하지 않지만,당신은 원하지 않는 전체 형태로 처리하거나 게시 다시(을 잃고 모든 입력)하기 전에 손을 수 없는 단순히 넣어에서 검사 현장에 대 한 화면에 그들(그리고 어쩌면 기타 잠재적으로 위험한)문자가?

없음의 제안에는 나를 위해 일했습니다.나는 원하지 않았다면 이 기능을 해제에 대한 전체적인 웹사이트를 어쨌든기 때문에 99%시간을 내가 원하지 않는 내 사용자는 배치에서 HTML 로 web forms.나는 그냥 만든 내 자신의 작업 방식 때문에 나는 단 하나의 사용이 특정 응용 프로그램.변환 입력하 HTML 코드에서 뒤에 삽입 나의 데이터베이스입니다.

같은 것을 사용할 수 있습니다:

var nvc = Request.Unvalidated().Form;

후에, nvc["yourKey"] 작업해야 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top