ValidateRequest = "false" não funciona no Asp.Net 4

156

Eu tenho um formulário no qual eu uso o ckeditor. Este formulário funcionou bem no Asp.Net 2.0 e 3.5, mas agora não funciona no Asp.Net 4+. Eu tenho a diretiva ValidateRequest = "false". Alguma sugestão?

HasanG
fonte
Há um pequeno artigo sobre a renderização de controles de validação corretamente, se alguém se importa: Validação de erro no .NET 4
Ian
alguém pode me informar quais são as desvantagens de usar ValidationRequest = false?
Fc123

Respostas:

194

Solução encontrada na página de erro. Só é necessário adicionar requestValidationMode = "2.0"

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

Informações do MSDN: Propriedade HttpRuntimeSection.RequestValidationMode

HasanG
fonte
1
isso é incrível, mas alguém sabe como definir isso por página? Além disso, como coloco isso no web.config para que ele ainda funcione com o .NET 2?
MK.
1
@ MK: Eu não acho que há uma diretiva de página para esta configuração. Você não pode fazê-lo rodar no .net 2. Não acho que isso seja necessário. Porque você pode apenas criar um aplicativo Web segmentado apenas para uma versão da estrutura. Basta copiar esta linha para .net 4 web.config que precisa ...
Hasang
2
Mas o que mudou na validação do .net 4? Existe uma maneira de fazer isso sem alterar o modo de validação?
Sly
4
@Sly: Você pode encontrar resposta aqui: asp.net/learn/whitepapers/aspnet4/…
HasanG
alguém pode me informar por que no aplicativo asp.net 4.0 usando requestValidationMode = "2.0" é uma boa idéia?
Fc123
102

Existe uma maneira de voltar a validação para 2.0 para uma página. Basta adicionar o código abaixo ao seu web.config:

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

    ...
    the rest of your configuration
    ...

</configuration>
Ben Hoffman
fonte
O local é qualquer caminho e é baseado em qualquer nó abaixo da pasta que você especificar na árvore.
DFTR 24/10/11
7
Esta é uma solução melhor do que a resposta aceita, porque não é ampla aplicação bastante limitada ao âmbito específico que você definir no caminho localização
Charles Wesley
5
A declaração <location ..> acima deve ser colocada dentro da declaração <configuration>, mas não mais aninhada.
Rbassett
1
A configuração por página parece não estar funcionando para projetos direcionados ao .NET 4.6.1.
Dennis T --Reinstate Monica--
56

Sei que essa é uma pergunta antiga, mas se você encontrar esse problema no MVC 3, poderá decorar o seu ActionMethodcom [ValidateInput(false)]e simplesmente desativar a validação de solicitação para um único ActionMethod, o que é útil. E você não precisa fazer alterações no web.configarquivo, para poder usar a validação de solicitação do .NET 4 em qualquer outro lugar.

por exemplo

[ValidateInput(false)]
public ActionMethod Edit(int id, string value)
{
    // Do your own checking of value since it could contain XSS stuff!
    return View();
}
Tom Chantler
fonte
1
@RossCooper esta é para asp.net MVC única
mxmissile
28

Isso funciona sem alterar o modo de validação.

Você tem que usar um System.Web.Helpers.Validation.Unvalidatedajudante de System.Web.WebPages.dll. Ele retornará um UnvalidatedRequestValuesobjeto que permite acessar o formulário e QueryString sem validação.

Por exemplo,

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

Funciona para mim no MVC3 e no .NET 4.

Assassino
fonte
1
Você pode fornecer um exemplo de como recuperar uma queryString com esse método? Continuo recebendo 'Não validado não é membro de ...' todos os objetos aos quais tento anexá-lo. Eu acho que pode estar faltando um include
CodedMonkey
3
var queryValue = Server.UrlDecode (Request.Unvalidated ("MyQueryKey"));
Sfuqua
1
Definitivamente, essa deve ser a resposta aceita. Mantém a segurança e é extremamente flexível, pois você pode usá-lo de maneira seletiva.
cmartin
Para formulários da Web você tem que substituir a entrada na coleção QueryString para validação evitar erro de ver Um potencialmente valor Request.QueryString perigoso foi detectado do cliente ao enviar html marcação de chamada jquery post para página asp.net
Michael Freidgeim
15

Observe que outra abordagem é manter o comportamento de validação 4.0, mas definir sua própria classe que deriva RequestValidatore define:

<httpRuntime requestValidationType="YourNamespace.YourValidator" />

(onde YourNamespace.YourValidatorestá bem, você deve ser capaz de adivinhar ...)

Dessa forma, você mantém as vantagens do comportamento do 4.0s (especificamente, que a validação ocorre no início do processamento), além de permitir as solicitações que você precisa deixar passar.

Jon Hanna
fonte
7
Isso é bom de saber. Mas ainda acho que todo o recurso de validação de solicitação do ASP.Net está equivocado. A entrada em si não é o problema, é o que você faz com ela. Pode ser perfeitamente válido aceitar código SQL, HTML ou JavaScript como entrada para seu aplicativo, desde que você o codifique / escape corretamente antes de produzi-lo ou armazená-lo em seu banco de dados.
22813 Jordan Rieger
2
@JordanRieger Concordo parcialmente. OOTB, pelo menos, tem a vantagem de deixar de lado o padrão de segurança (não pense nas coisas e você recebe erros, em vez de 0), mas é um incômodo e o comportamento anterior à 4.0 é quase tudo ou nada. Existe algo na capacidade de ter uma camada de validação usada antes de qualquer outro processamento, como em um requestValidationType personalizado, mas muita validação precisa estar mais ligada a outro processamento. Em suma, acho que faz mais para proteger as pessoas com maus hábitos de algumas (mas não todas) divisões do que para incentivar bons hábitos.
Jon Hanna