ValidateRequest =“false”가 Asp.Net 4에서 작동하지 않습니다


156

ckeditor를 사용하는 양식이 있습니다. 이 형식은 Asp.Net 2.0 및 3.5에서 제대로 작동했지만 이제 Asp.Net 4 이상에서는 작동하지 않습니다. ValidateRequest = "false"지시문이 있습니다. 어떤 제안?


누군가 관심이 있다면 유효성 검사 컨트롤을 올바르게 렌더링하는 방법에 대한 짧은 기사가 있습니다. .NET 4의 오류 유효성 검사
Ian

ValidationRequest = false 사용의 단점은 무엇입니까?
fc123

답변:


194

오류 페이지에서 해결책을 찾았습니다. requestValidationMode = "2.0"을 추가해야합니다.

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

MSDN 정보 : HttpRuntimeSection.RequestValidationMode 속성


1
대단하지만 페이지 당 설정하는 방법을 아는 사람이 있습니까? 또한 .NET 2에서 여전히 작동하도록 web.config에 어떻게 넣습니까?
MK.

1
@ MK :이 설정에 대한 페이지 지시문이 없다고 생각합니다. .net 2에서 실행할 수 없습니다. 나는 그것이 필요하다고 생각하지 않습니다. 하나의 프레임 워크 버전 만 대상으로하는 웹앱을 빌드 할 수 있기 때문입니다. 이 줄을 .net 4 web.config에 복사하면됩니다.
HasanG

2
그러나 .net 4의 유효성 검사에서 변경된 사항은 무엇입니까? 유효성 검사 모드를 변경하지 않고 수행 할 수있는 방법이 있습니까?
Sly

4
@Sly : 여기서 답변을 찾을 수 있습니다 : asp.net/learn/whitepapers/aspnet4/…
HasanG

누구든지 requestValidationMode = "2.0"을 사용하는 asp.net 4.0 응용 프로그램에서 왜 좋은 아이디어인지 알려주십시오.
fc123

102

한 페이지에 대해 유효성 검사를 2.0으로 다시 설정하는 방법이 있습니다. 아래 코드를 web.config에 추가하십시오.

<configuration>
    <location path="XX/YY">
        <system.web>
            <httpRuntime requestValidationMode="2.0" />
        </system.web>
    </location>

    ...
    the rest of your configuration
    ...

</configuration>

위치는 임의의 경로이며 트리에서 지정한 폴더 아래의 모든 노드를 기준으로합니다.
DFTR

7
오히려 당신이 위치 경로에서 정의한 특정 범위로 축소 폭 넓은 응용 프로그램이 아닙니다 때문에 허용 대답보다 더 나은 솔루션입니다
찰스 웨슬리

5
위의 <location ..> 선언은 <configuration> 선언 안에 배치해야하지만 더 이상 중첩되지 않아야합니다.
rbassett

1
.NET 4.6.1을 대상으로하는 프로젝트에서 페이지 당 설정이 작동하지 않는 것 같습니다.
데니스 T-복귀 모니카

56

나는 이것이 오래된 질문이라는 것을 알고 있지만 MVC 3 에서이 문제가 발생하면 ActionMethodwith를 장식 [ValidateInput(false)]하고 단일 요청 유효성 검사를 끌 수 있습니다 ActionMethod. 또한 web.config파일을 변경할 필요가 없으므로 다른 곳에서도 .NET 4 요청 유효성 검사를 계속 사용할 수 있습니다.

예 :

[ValidateInput(false)]
public ActionMethod Edit(int id, string value)
{
    // Do your own checking of value since it could contain XSS stuff!
    return View();
}

1
@RossCooper 이것은 asp.net MVC 전용입니다
mxmissile

28

이것은 유효성 검사 모드를 변경하지 않고 작동합니다.

System.Web.Helpers.Validation.Unvalidated도우미 를 사용해야합니다 System.Web.WebPages.dll. UnvalidatedRequestValues유효성 검사없이 폼과 QueryString에 액세스 할 수 있는 객체 를 반환합니다 .

예를 들어

var queryValue = Server.UrlDecode(Request.Unvalidated("MyQueryKey"));

MVC3 및 .NET 4에서 작동합니다.


1
이 메소드로 queryString을 검색하는 방법에 대한 예제를 제공 할 수 있습니까? 계속해서 '유효하지 않음은 회원이 아닙니다 ...'라는 메시지가 계속 표시됩니다. 포함이 누락 될 수 있습니다.
CodedMonkey

3
var queryValue = Server.UrlDecode (Request.Unvalidated ( "MyQueryKey"));
sfuqua

1
이것은 분명히 받아 들여질만한 대답이어야합니다. 보안을 유지하고 선택적으로 사용할 수 있으므로 매우 유연합니다.
cmartin


15

또 다른 접근 방식은 4.0 유효성 검사 동작을 유지하지만 파생 RequestValidator하고 설정 하는 자체 클래스를 정의하는 것 입니다.

<httpRuntime requestValidationType="YourNamespace.YourValidator" />

( YourNamespace.YourValidator잘, 당신은 추측 할 수 있어야한다 ...)

이렇게하면 4.0s 동작 (특히 유효성 검사가 처리 초기에 발생 함)의 이점을 유지하면서 통과해야하는 요청도 허용 할 수 있습니다.


7
알아두면 좋습니다. 그러나 여전히 ASP.Net의 전체 요청 유효성 검사 기능이 잘못되었다고 생각합니다. 입력 자체는 문제가 아니며 사용자 가 수행 하는 작업입니다. 출력하거나 데이터베이스에 저장하기 전에 인코딩, 이스케이프 처리하는 한 SQL, HTML 또는 JavaScript 코드를 앱의 입력으로 받아들이는 것이 완벽하게 유효 할 수 있습니다.
Jordan Rieger

2
@JordanRieger 나는 부분적으로 동의합니다. OOTB, 적어도 보안을 유지하기 위해 기본값을 설정하는 이점이 있지만 (0wned가 아니라 오류를 생각하지 마십시오) 약간 번거롭고 4.0 이전의 동작은 전혀 또는 전혀 없습니다. 사용자 정의 requestValidationType과 같이 다른 처리 전에 사용되는 유효성 검사 계층을 가질 수있는 기능이 있지만 다른 유효성 검사와 더 많은 유효성 검사가 필요합니다. 나는 좋은 습관을 장려하는 것보다 나쁜 습관을 가진 사람들을 (일부는 아님) 일부로부터 보호하는 것이 더 좋다고 생각합니다.
존 한나
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.