질문자 :Radu094
사용자가 내 웹 애플리케이션의 페이지에 <
또는 >
가 포함된 항목을 게시할 때마다 이 예외가 발생합니다.
누군가 텍스트 상자에 문자를 입력했기 때문에 예외를 던지거나 전체 웹 응용 프로그램을 충돌시키는 현명함에 대해 논의하고 싶지는 않지만 이를 처리할 수 있는 우아한 방법을 찾고 있습니다.
예외 트래핑 및 표시
오류가 발생했습니다. 돌아가서 전체 양식을 다시 입력하십시오. 그러나 이번에는 <
나에게 충분히 전문적이지 않은 것 같다.
사후 유효성 검사( validateRequest="false"
)를 비활성화하면 이 오류가 확실히 방지되지만 페이지가 여러 공격에 취약해집니다.
이상적으로는 HTML 제한 문자가 포함된 포스트백이 발생하면 Form 컬렉션에 게시된 값이 자동으로 HTML로 인코딩됩니다. 따라서 내 텍스트 상자 .Text
something & lt; html & gt;
핸들러에서 이 작업을 수행할 수 있는 방법이 있습니까?
게시 된 모든 데이터를 인코딩하려고 시도하여 잘못된 각도에서 공격하고 있다고 생각합니다.
" <
"는 데이터베이스 필드, 구성, 파일, 피드 등과 같은 다른 외부 소스에서도 올 수 있습니다.
또한 " <
"는 본질적으로 위험하지 않습니다. HTML 출력으로 인코딩되지 않은 문자열을 작성할 때(XSS로 인해) 특정 컨텍스트에서만 위험합니다.
다른 상황에서는 다른 하위 문자열이 위험합니다. 예를 들어 사용자가 제공한 URL을 링크에 쓰는 경우 하위 문자열 " javascript:
"가 위험할 수 있습니다. 반면에 작은 따옴표 문자는 SQL 쿼리에서 문자열을 삽입할 때 위험하지만 양식에서 제출하거나 데이터베이스 필드에서 읽은 이름의 일부인 경우 완벽하게 안전합니다.
결론은 위험한 문자에 대한 임의 입력을 필터링할 수 없다는 것입니다. 올바른 상황에서는 모든 문자가 위험할 수 있기 때문입니다. 일부 특정 문자는 특별한 의미가 있는 다른 하위 언어와 교차하기 때문에 위험할 수 있는 지점에서 인코딩해야 합니다. HTML에 문자열을 작성할 때 Server.HtmlEncode를 사용하여 HTML에서 특별한 의미를 갖는 문자를 인코딩해야 합니다. 동적 SQL 문에 문자열을 전달하는 경우 다른 문자를 인코딩해야 합니다.
당신이 HTML로 문자열을 통과 어디서나 당신은 당신이 HTML 인코딩 경우, 다음 설정 ValidateRequest="false"
에서 <%@ Page ... %>
당신의 지시 .aspx
파일 (들).
.NET 4에서는 조금 더 해야 할 수도 있습니다. 때로는 web.config( 참조 ) <httpRuntime requestValidationMode="2.0" />
도 추가해야 합니다.
JacquesBASP.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
Zack PetersonASP.NET MVC(버전 3부터 시작)에서는 모델의 속성에 AllowHtml
속성에 대한 요청 유효성 검사를 건너뛰어 모델 바인딩 중에 요청에 HTML 마크업을 포함할 수 있습니다.
[AllowHtml] public string Description { get; set; }
Anthony Johnston.NET 4.0을 사용하는 경우 <system.web>
태그 내의 web.config 파일에 다음을 추가해야 합니다.
<httpRuntime requestValidationMode="2.0" />
.NET 2.0에서 요청 유효성 검사는 aspx
요청에만 적용되었습니다. .NET 4.0에서는 모든 요청을 포함하도록 확장되었습니다. 다음을 지정하여 .aspx
를 처리할 때 XSS 유효성 검사 만 수행하도록 되돌릴 수 있습니다.
requestValidationMode="2.0"
다음을 지정하여 요청 유효성 검사를 완전히 비활성화할 수 있습니다.
validateRequest="false"
JordanC<location>
요소에 모두 넣어 전체 사이트 대신 특정 페이지에 대한 입력으로 마크업을 허용할 수 있습니다. 이렇게 하면 다른 모든 페이지가 안전한지 확인할 수 있습니다. .aspx 페이지 ValidateRequest="false"
를 넣을 필요가 없습니다.
<configuration> ... <location path="MyFolder/.aspx"> <system.web> <pages validateRequest="false" /> <httpRuntime requestValidationMode="2.0" /> </system.web> </location> ... </configuration>
어떤 페이지가 입력으로 마크업을 허용하는지 사이트 수준에서 볼 수 있기 때문에 web.config 내에서 이것을 제어하는 것이 더 안전합니다.
요청 유효성 검사가 비활성화된 페이지에서 프로그래밍 방식으로 입력 유효성을 검사해야 합니다.
Carter Medlin이전 답변은 훌륭하지만 HTML/JavaScript 삽입에 대한 유효성 검사에서 단일 필드를 제외하는 방법에 대해서는 아무도 말하지 않았습니다. 이전 버전에 대해서는 모르지만 MVC3 베타에서는 다음과 같이 할 수 있습니다.
[HttpPost, ValidateInput(true, Exclude = "YourFieldName")] public virtual ActionResult Edit(int id, FormCollection collection) { ... }
이것은 여전히 제외된 필드를 제외한 모든 필드의 유효성을 검사합니다. 이것에 대한 좋은 점은 유효성 검사 속성이 여전히 필드의 유효성을 검사하지만 "잠재적으로 위험한 Request.Form 값이 클라이언트에서 감지되었습니다" 예외가 발생하지 않는다는 것입니다.
정규 표현식의 유효성을 검사하기 위해 이것을 사용했습니다. 정규식이 유효한지 여부를 확인하기 위해 고유한 ValidationAttribute를 만들었습니다. 정규식은 위의 코드를 적용한 스크립트처럼 보이는 것을 포함할 수 있으므로 정규식이 유효한지 여부를 계속 검사하지만 스크립트나 HTML이 포함된 경우에는 검사하지 않습니다.
gligoranASP.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) { ... }
ranthonissen텍스트 상자 내용을 HTML로 인코딩 할 수 있지만 불행히도 예외가 발생하는 것을 막지는 못합니다. 제 경험상 방법이 없으며 페이지 유효성 검사를 비활성화해야 합니다. 그렇게 함으로써 당신은 "조심할게, 약속할게"라고 말하는 것입니다.
Pavel Chuchuva이 질문에 대한 답은 간단합니다.
var varname = Request.Unvalidated["parameter_name"];
이렇게 하면 특정 요청에 대한 유효성 검사가 비활성화됩니다.
flakomaloGlobal.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
BenMaddoxMVC의 경우 다음을 추가하여 입력 유효성 검사를 무시하십시오.
[입력 확인(거짓)]
컨트롤러의 각 작업 위에 있습니다.
A.Dara일부 .NET 컨트롤은 자동으로 출력을 HTML로 인코딩한다는 점에 유의하십시오. 예를 들어 TextBox 컨트롤에 .Text 속성을 설정하면 자동으로 인코딩됩니다. <
를 <
로 변환하는 것을 의미합니다. , >
안으로 >
및 &
로 &
. 그러니 조심하세요...
myTextBox.Text = Server.HtmlEncode(myStringFromDatabase); // Pseudo code
그러나 HyperLink, Literal 및 Label의 .Text 속성은 HTML을 인코딩하지 않으므로 Server.HtmlEncode()를 래핑합니다. <script> window.location = "http://www.google.com"; </script>
페이지에 출력되고 이후에 실행되지 않도록 합니다.
어떤 것이 인코딩되고 어떤 것이 인코딩되지 않는지 알아보기 위해 약간의 실험을 하십시오.
Dominic Pettiferweb.config 파일의 태그 내에 requestValidationMode="2.0" 속성이 있는 httpRuntime 요소를 삽입합니다. 또한 페이지 요소에 validateRequest="false" 속성을 추가합니다.
예시:
<configuration> <system.web> <httpRuntime requestValidationMode="2.0" /> </system.web> <pages validateRequest="false"> </pages> </configuration>
Mahdi jokarValidateRequest를 비활성화하지 않으려면 예외를 피하기 위해 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);")
YORENGOY아직 아무도 아래에 언급하지 않은 것 같지만 문제가 해결되었습니다. 그리고 누군가가 예라고 말하기 전에 Visual Basic입니다... 젠장.
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Example.aspx.vb" Inherits="Example.Example" **ValidateRequest="false"** %>
단점이 있는지 모르겠지만 저에게는 이것이 훌륭했습니다.
Piercy또 다른 솔루션은 다음과 같습니다.
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; } }
Sel프레임워크 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"
%>
하지 않는 것이 좋습니다.
Durgesh PandeyASP.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(); } }
Jaider나는 당신이 그것을 모듈에서 할 수 있다고 생각합니다. 그러나 그것은 몇 가지 질문을 남겨 둡니다. 입력을 데이터베이스에 저장하려면 어떻게 해야 합니까? 갑자기 인코딩된 데이터를 데이터베이스에 저장하기 때문에 데이터베이스의 입력을 신뢰하게 되며 이는 아마도 나쁜 생각일 것입니다. 이상적으로는 인코딩되지 않은 원시 데이터를 데이터베이스에 저장하고 매번 인코딩합니다.
페이지 수준에서 보호를 비활성화한 다음 매번 인코딩하는 것이 더 나은 옵션입니다.
Server.HtmlEncode를 사용하는 대신 Microsoft ACE 팀 의 보다 새롭고 완전한 Anti-XSS 라이브러리를 살펴봐야 합니다.
blowdartJavaScript를 사용하여 .NET에서 디코딩되고 jQuery가 필요하지 않은 데이터를 인코딩하는 솔루션을 찾았습니다.
텍스트 영역에 boo()를 호출하는 onchange를 포함합니다.
<textarea id="userbox" onchange="boo();"></textarea>
마지막으로 .NET에서
string val = Server.UrlDecode(HiddenField1.Value);
나는 이것이 단방향이라는 것을 알고 있습니다. 양방향이 필요한 경우 창의력을 발휘해야 하지만 web.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" />
이것은 잘 작동합니다. 해커가 JavaScript를 우회하여 게시하려고 하면 오류만 표시됩니다. 데이터베이스에 인코딩된 이 모든 데이터를 저장한 다음(서버 측에서) 이스케이프를 해제하고 다른 곳에 표시하기 전에 공격을 구문 분석하고 확인할 수 있습니다.
Jason Shuler원인
ASP.NET은 기본적으로 XSS( 교차 사이트 스크립팅 ) 및 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 값이 감지되었습니다.
vakeel여기에 있는 다른 솔루션도 좋지만 특히 적절한 크기의 사이트에 100개 이상의 모델이 있는 경우 모든 단일 Model 속성에 [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()를 사용하는 경우가 아니면 이 기능이 필요하지 않아야 합니다.
magritte나도이 오류가 발생했습니다.
제 경우에는 사용자가 á
를 입력했습니다(ASP.NET 멤버십 공급자 관련).
사용자에게 해당 역할을 부여하는 메서드에 역할 이름을 전달했는데 $.ajax
게시 요청이 비참하게 실패했습니다...
문제를 해결하기 위해 이렇게 했습니다.
대신에
data: { roleName: '@Model.RoleName', users: users }
이 작업을 수행
data: { roleName: '@Html.Raw(@Model.RoleName)', users: users }
@Html.Raw
가 트릭을 수행했습니다.
역할 이름을 HTML 값 roleName="Cadastro bás"
. 이 값은 HTML 엔티티 á
ASP.NET MVC에 의해 차단되었습니다. 이제 roleName
매개변수 값이 다음과 같이 표시되어야 합니다. roleName="Cadastro Básico"
및 ASP.NET MVC 엔진이 더 이상 요청을 차단하지 않습니다.
Leniel Maccaferri>
, , <
등과 같은 특수 문자가 정말로 필요한 경우 페이지 유효성 검사를 비활성화합니다. 그런 다음 사용자 입력이 표시될 때 데이터가 HTML로 인코딩되었는지 확인합니다.
페이지 유효성 검사에 보안 취약점이 있으므로 우회할 수 있습니다. 또한 페이지 유효성 검사에만 의존해서는 안 됩니다.
참조: http://web.archive.org/web/20080913071637/http://www.procheckup.com:80/PDFs/bypassing-dot-NET-ValidateRequest.pdf
woanyJavaScript의 escape(string) 함수를 사용하여 특수 문자를 바꿀 수도 있습니다. 그런 다음 서버 측에서는 서버를 사용합니다. 다시 전환하려면 URLDecode(string).
이렇게 하면 입력 유효성 검사를 끌 필요가 없으며 문자열에 HTML 콘텐츠가 있을 수 있다는 것이 다른 프로그래머에게 더 명확해집니다.
Trisped다음과 같이 원하지 않는 문자를 확인하기 위해 각 포스트백 전에 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; }
내 페이지는 대부분 데이터 입력이며 포스트백을 수행하는 요소는 거의 없지만 최소한 데이터는 유지됩니다.
Ryan다음과 같이 사용할 수 있습니다.
var nvc = Request.Unvalidated().Form;
나중에 nvc["yourKey"]
가 작동해야 합니다.
Ady Levy모델 바인딩을 사용하지 않고 Request.Form에서 각 매개변수를 추출하고 입력 텍스트가 해를 끼치지 않을 것이라고 확신하는 사람들에게는 다른 방법이 있습니다. 훌륭한 솔루션은 아니지만 작업을 수행할 것입니다.
클라이언트 측에서 uri로 인코딩한 다음 보냅니다.
예:
encodeURIComponent($("#MsgBody").val());
서버 측에서 수락하고 uri로 디코딩합니다.
예:
string temp = !string.IsNullOrEmpty(HttpContext.Current.Request.Form["MsgBody"]) ? System.Web.HttpUtility.UrlDecode(HttpContext.Current.Request.Form["MsgBody"]) : null;
또는
string temp = !string.IsNullOrEmpty(HttpContext.Current.Request.Form["MsgBody"]) ? System.Uri.UnescapeDataString(HttpContext.Current.Request.Form["MsgBody"]) : null;
UrlDecode
와 UnescapeDataString
의 차이점을 찾으십시오.
Wahid Masud만큼 이들 만 있습니다 "<"와 ">"(이 아닌 큰 따옴표 자체가) 문자 및 <입력 값 = "이"/>, 당신이 이제 안전 (잠시 동안 <텍스트 영역과 같은 상황에서 그들을 사용하고로 > 이것은 </textarea> 당신은 물론 취약할 것입니다). 그게 당신의 상황을 간단하게,하지만 아무것도 이상의 다른 게시 된 솔루션 중 하나를 사용할 수 있습니다.
Paweł Hajdan사용자에게 < 및 >를 사용하지 말라고 말하려는 경우에는 전체 양식을 처리/게시하고 모든 입력을 잃는 것을 원하지 않을 것입니다. 필드 주변의 유효성 검사기를 사용하여 해당(및 다른 잠재적으로 위험한) 문자를 선별할 수 있습니까?
Captain Toad출처 : http:www.stackoverflow.com/questions/81991/a-potentially-dangerous-request-form-value-was-detected-from-the-client