256 votes

Une valeur de Request.Path potentiellement dangereuse a été détectée chez le client (*)

Je reçois l'erreur plutôt explicite suivante :

Une valeur Request.Path potentiellement dangereuse a été détectée du client (*).

Le problème est dû à * dans l'URL de la requête :

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

Cette URL est utilisée pour peupler une page de recherche où 'test*' est le terme de recherche et le reste de l'URL concerne différents filtres.

Y a-t-il un moyen facile d'autoriser ces caractères spéciaux dans l'URL ? J'ai essayé de modifier le web.config, en vain.

Dois-je encoder / décoder manuellement les caractères spéciaux ? Ou existe-t-il une bonne pratique pour le faire, je préférerais éviter d'utiliser des chaînes de requête - mais cela pourrait être une option.

L'application elle-même est une application webforms c# asp.net qui utilise le routage pour produire le joli URL ci-dessus.

1 votes

Votre page a-t-elle ValidateRequest=false en haut?

0 votes

Je ne sais pas pour quelle raison le site Web essayait intérieurement une redirection qui créait une URL comme 'localhost/://localhost/myWebsiteName' qui me donnait la même erreur. Je ne sais pas pourquoi le pipeline ASP.net considère cela comme une URL de demande dangereuse.

352voto

Dave Transom Points 1338

Si vous utilisez .NET 4.0, vous devriez pouvoir autoriser ces URL via le fichier web.config

Remarque, j'ai simplement supprimé l'astérisque (*), la chaîne par défaut d'origine est :

Voir cette question pour plus de détails.

6 votes

Y a-t-il un moyen de le faire en utilisant un attribut MVC sur une action pour ne pas avoir à le désactiver pour l'ensemble de l'application ? Similaire à cette réponse ici: stackoverflow.com/a/1540976/298758

6 votes

@longda: Peut-être essayer d'envelopper cela avec un élément pour l'URL dont vous avez besoin. Utiliser la réflexion serait raisonnablement simple d'un point de vue global, mais je ne suis pas sûr de le configurer sur une base par contrôleur/action. Peut-être commencer une question?

0 votes

Il ne fonctionne tout simplement pas sur le projet ASP.net MVC, en recevant l'exécution du processus pour déterminer la mise en page dans viewStart, j'ai obtenu cette erreur : Caractère illégal dans le chemin.

106voto

Guffa Points 308133

Le caractère * n'est pas autorisé dans le chemin de l'URL, mais il n'y a aucun problème à l'utiliser dans la chaîne de requête :

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

Il ne s'agit pas d'un problème d'encodage, le caractère * n'a pas de signification spéciale dans une URL, donc il n'importe pas si vous l'encodez ou non. Vous auriez besoin de l'encoder en utilisant un autre schéma, puis de le décoder.

Par exemple en utilisant un caractère arbitraire comme caractère d'échappement :

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

Et décoder :

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

17 votes

Le jeu "xxx" "xxy" "xyy" est plutôt ingénieux. Vous voudrez peut-être expliquer la logique derrière cela afin de ne pas confondre les lecteurs.

3 votes

La demande était de l'utiliser dans le PATH et non dans la chaîne de requête.

0 votes

Je suis tombé sur le même scénario où l'un de mes paramètres était une URL. Même lorsqu'il est correctement encodé en URL, j'obtenais cette erreur. J'ai finalement encodé en base64 le paramètre (et décodé dans mon API) ce qui était beaucoup plus facile que d'essayer de comprendre ce qu'il se passait. Probablement un meilleur choix que de mettre en œuvre votre propre routine de remplacement également.

13voto

MNF Points 307

Pour moi, je travaille sur .net 4.5.2 avec web api 2.0, J'ai la même erreur, je l'ai réglée simplement en ajoutant requestPathInvalidCharacters="". Dans requestPathInvalidCharacters, vous devez définir les caractères non autorisés, sinon vous devez supprimer les caractères qui causent ce problème.

     ....

**Remarquez que ce n'est pas une bonne pratique, peut-être qu'une publication avec ce paramètre en tant qu'attribut d'un objet est meilleure ou essayez d'encoder le caractère spécial. -- Après avoir recherché les meilleures pratiques pour la conception d'une API REST, j'ai découvert que pour la recherche, le tri et la pagination, nous devons gérer les paramètres de requête comme ceci

/companies?search=Digital%26Mckinsey

et cela résout le problème lorsque nous encodons & et le remplaçons dans l'URL par %26. De toute façon, sur le serveur, nous recevons le paramètre correct Digital&Mckinsey

ce lien peut aider sur les meilleures pratiques de conception d'une API Web REST https://hackernoon.com/restful-api-designing-guidelines-the-best-practices-60e1d954e7c9

0 votes

Je pense que c'est une bonne pratique de le faire en fait. La protection contre les entrées incorrectes devrait être dans le code.

9voto

Tejs Points 23834

Vous devriez encoder la valeur de la route, puis (si nécessaire) décoder la valeur avant de rechercher.

0 votes

Merci pour votre réponse. Voulez-vous dire effectivement faire un remplacement sur des éléments tels que * et ensuite les remplacer en les lisant à nouveau?

0 votes

Pouvez-vous montrer un exemple de code pour encoder et décoder les valeurs?

2voto

trykyn Points 323

Pour moi, en tapant l'URL, un utilisateur a accidentellement utilisé un / au lieu d'un ? pour démarrer les paramètres de la requête

par exemple :

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

qui aurait dû être :

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

0 votes

Oui, même pour moi

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X