Um valor Request.Path potencialmente perigoso foi detectado no cliente (*)

218

Estou recebendo o erro bastante auto-explicativo:

Um valor Request.Path potencialmente perigoso foi detectado no cliente (*).

O problema ocorre *no URL da solicitação:

https://stackoverflow.com/Search/test*/0/1/10/1

Esse URL é usado para preencher uma página de pesquisa em que 'teste *' é o termo de pesquisa e o restante está relacionado a vários outros filtros.

Existe uma maneira fácil de permitir esses caracteres especiais no URL? Eu tentei modificar o web.config, sem sucesso.

Devo codificar / decodificar manualmente os caracteres especiais? Ou existe uma prática recomendada para fazer isso, eu gostaria de evitar o uso de strings de consulta. - mas pode ser uma opção.

O aplicativo em si é um c# asp.netaplicativo de formulários da web que usa roteamento para produzir a URL agradável acima.

samdd
fonte
1
Sua página tem ValidateRequest=falseno topo?
Neil Knight
Não sei por que motivo o site estava tentando internamente um redirecionamento que estava criando uma URL como ' localhost /: // localhost / myWebsiteName ' que estava me dando o mesmo erro. Não sei por que o pipeline do ASP.net considera um URL de solicitação perigoso.
RBT

Respostas:

97

O *caractere não é permitido no caminho da URL, mas não há problema em usá-lo na string de consulta:

http://localhost:3286/Search/?q=test*

Não é um problema de codificação, o *caractere não tem significado especial em um URL, portanto, não importa se você o codifica ou não. Você precisaria codificá-lo usando um esquema diferente e decodificá-lo.

Por exemplo, usando um caractere arbitrário como caractere de escape:

query = query.Replace("x", "xxx").Replace("y", "xxy").Replace("*", "xyy");

E decodificação:

query = query.Replace("xyy", "*").Replace("xxy", "y").Replace("xxx", "x");
Guffa
fonte
15
O jogo "xxx" "xxy" "xyy" é bastante inteligente. Você pode elaborar a lógica por trás disso para não confundir os leitores.
SimpleVar 28/08
2
A solicitação era para usá-lo na PATHcadeia de caracteres e não na query.
Hugo Delsing 16/03/2015
Encontrei o mesmo cenário em que um dos meus parâmetros era um URL. Mesmo quando codificado corretamente em URL, eu receberia esse erro. Finalmente, apenas base64 codificou o parâmetro (e decodifique na minha API), que era muito mais fácil do que tentar descobrir o que estava acontecendo. Provavelmente, é uma escolha melhor que implementar sua própria rotina de substituição também.
SpokaneDJ
1
Você não pode usar aa<=> ae ab<=> *como um esquema de codificação mais simples?
Palavras como Jared
Por enquanto isso me salvou, obrigado, mas no momento oportuno, quero verificar este aviso: stackoverflow.com/a/603962/1830909 e ficarei feliz se ouvir seu pensamento.
QMaster 20/04
316

Se você estiver usando o .NET 4.0, poderá permitir esses URLs através do web.config

<system.web>
    <httpRuntime 
            requestPathInvalidCharacters="&lt;,&gt;,%,&amp;,:,\,?" />
</system.web>

Observe que acabei de remover o asterisco (*), a string padrão original é:

<httpRuntime 
          requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,:,\,?" />

Veja esta pergunta para mais detalhes.

Dave Transom
fonte
5
Existe alguma maneira de fazer isso usando um atributo mvc em uma ação, para que não seja necessário desativá-lo para todo o aplicativo? Semelhante a esta resposta aqui: stackoverflow.com/a/1540976/298758
longda
4
@ Longda: Talvez tente envolvê-lo com um elemento <location path = "my / path"> para o URL que você precisa. Usar a reflexão seria razoavelmente simples do ponto de vista global, mas não tenho certeza de defini-la por controlador / ação. Talvez comece uma pergunta?
Dave Transom
Ele simplesmente não está funcionando no projeto ASP.net MVC, recebendo o processo de execução para determinar o layout no viewStart recebeu este erro: Caractere ilegal no caminho.
QMaster 20/04
7

Para mim, estou trabalhando no .net 4.5.2 com a API da Web 2.0, tenho o mesmo erro, eu o configurei apenas adicionando requestPathInvalidCharacters = "" no requestPathInvalidCharacters que você precisa definir caracteres não permitidos, caso contrário, você deve remover os caracteres que causar esse problema.

<system.web>
     <httpRuntime targetFramework="4.5.2" requestPathInvalidCharacters="" />
     <pages  >
      <namespaces>
     ....
 </namespaces>
    </pages> 
  </system.web>

** Observe que não é uma boa prática, pode ser um post com esse parâmetro, pois o atributo de um objeto é melhor ou tente codificar o caractere especial. - Depois de pesquisar as práticas recomendadas para projetar a API de descanso, descobri que na pesquisa, classificação e paginação, temos que lidar com o parâmetro de consulta como este

/companies?search=Digital%26Mckinsey

e isso resolve o problema quando o codificamos e o substituímos no URL em% 26 de qualquer maneira, no servidor recebemos o parâmetro correto Digital & Mckinsey

este link pode ajudar nas melhores práticas de criação de APIs da restante web https://hackernoon.com/restful-api-designing-guidelines-the-best-practices-60e1d954e7c9

MNF
fonte
6

Você deve codificar o valor da rota e depois (se necessário) decodificar o valor antes de pesquisar.

Tejs
fonte
Obrigado pela sua resposta. Você quer dizer substituir efetivamente itens como * e, em seguida, substituí-los novamente quando você o estiver lendo?
Você pode mostrar um exemplo de código de codificação e decodificação dos valores?
Ciaran Gallagher
1

Para mim, ao digitar o URL, um usuário acidentalmente usou um / em vez de um? para iniciar os parâmetros de consulta

por exemplo:

url.com/endpoint/parameter=SomeValue&otherparameter=Another+value

que deveria ter sido:

url.com/endpoint?parameter=SomeValue&otherparameter=Another+value

trykyn
fonte
Sim, até mesmo para mim url.com/endpoint¶meter=SomeValue&otherparameter=AnotherValue
Bhargav Konda
0

Essa exceção ocorreu no meu pedido e foi bastante enganadora.

Foi lançada quando eu estava chamando um método da Web da página .aspx usando uma chamada de método ajax, passando um objeto de matriz JSON. A assinatura do método da página da Web continha uma matriz de um objeto .NET fortemente tipado, OrderDetails. A propriedade Actual_Qty foi definida como int, e a propriedade Actual_Qty do objeto JSON continha "4" (caractere de espaço extra). Após remover o espaço extra, a conversão foi possível, o método de Página da Web foi alcançado com êxito pela chamada ajax.

Bertha
fonte
0

Tente definir a propriedade do servidor do projeto da Web como IIS local, se for o IIS Express. Verifique se o URL do projeto está correto e crie um diretório virtual.

Burk
fonte
0

Ao lidar com URLs (Uniform Resource Locator) s, existem certos padrões de sintaxe . Nesta situação específica, estamos lidando com caracteres reservados .

Conforme o RFC 3986 , os caracteres reservados podem (ou não) ser definidos como delimitadores pela sintaxe genérica, por cada sintaxe específica do esquema ou pela sintaxe específica da implementação do algoritmo de desreferenciamento de um URI; E o asterisco (*) é um caractere reservado.

A melhor prática é usar caracteres não reservados em URLs ou tente codificá-lo.

Continue cavando :

Roshana Pitigala
fonte
1
Este erro também ocorre se o caractere reservado no URL for codificado em porcentagem, por exemplo, em %25vez de %, portanto, o IIS poderá retornar esse erro para um URL perfeitamente válido.
Florian Winter