Potentiellement dangereuse Demande.Valeur du chemin a été détectée par le client (&)
Je comprends pourquoi ce qui se passe mais j'ai besoin d'un travail autour de. J'ai regardé dans certaines autres questions sur StackOverflow mais aucun d'eux n'a été utile. Je ne veux pas désactiver l'entrée de validation tout au long de l'ensemble du site, parce que c'est certainement dangereux. Je n'ai qu'une (au moins pour l'instant) le lieu où j'ai besoin de désactiver l'entrée de validation.
J'ai décoré de la Méthode d'Action avec [ValidateInput(false)] attribut, et je suis codant pour les chaînes de avec Html.L'encodage. Mais toujours, je reçois le même message d'erreur. Voici mon point de vue:
<div id="sharwe-categories">
<ul class="menu menu-vertical menu-accordion">
@foreach(var topLevel in Model)
{
var topLevelName = Html.Encode(topLevel.Name);
<li class="topLevel">
<h3>
@Html.ActionLink(topLevel.Name, "Index", "Item", new { category = topLevelName }, new {@class = "main"} )
<a href="#" class="drop-down"></a>
</h3>
<ul>
@foreach (var childCategory in topLevel.Children)
{
var childcategoryName = Html.Encode(childCategory.Name);
<li>@Html.ActionLink(childCategory.Name, "Index", "Item", new RouteValueDictionary { { "category", topLevelName }, { "subcategory", childcategoryName } }, null)</li>
}
</ul>
</li>
}
</ul>
</div>
Comme vous pouvez le voir, il n'y a aucune entrée d'utilisateur. Mais quelques-uns des noms de catégorie "dangereux" de caractères... Toutes les solutions?
Koritnik: des Valeurs qui contiennent des "& "ou", " ou de tout caractère dangereux...
OriginalL'auteur Kassem | 2011-04-15
Vous devez vous connecter pour publier un commentaire.
Bien que Darin la réponse est tout à fait possible, je ne le recommande pas à l'aide de Scott, Hanselman la technique de la rotation de toute cette validation éteint étape par étape. Vous aurez tôt ou tard à la fin dans son profond...
Deuxième suggestion de l'utilisation d'Identifiants le long avec des feintes des chaînes de caractères (qui sont grands pour le RÉFÉRENCEMENT et les gens) est un moyen de aller, mais parfois ils ne sont pas réalisables. Imaginez cette URL de la requête:
Bien que nous avions ces Identifiants, nous pouvons compter sur l'homme/SEO friendly noms de catégorie en tant que bien, ce n'est certainement pas souhaitée. ID + Mannequin chaîne est faisable quand nous avons besoin de représenter un élément unique. Dans d'autres cas, il n'est pas. Et puisque vous avez à l'écran de la catégorie et sous-catégorie, c'est un problème.
De sorte que pouvez-vous faire?
Deux solutions possibles:
De nettoyage de la catégorie des noms seulement ont des caractères valides - ce qui peut être fait, mais si ce ne sont pas statiques et modifiable par les utilisateurs privilégiés, vous êtes hors de la chance ici, parce que même si vous avez nettoyé jusqu'à maintenant, quelqu'un va entrer dans quelque chose de valide plus tard
Nettoyage de votre chaîne sur l'aller - Lorsque vous utilisez le nom de la catégorie, la nettoyer et lors de la lecture et de l'utiliser (pour obtenir la catégorie réelle ID) que vous pouvez comparer fourni (préalablement lavé) nom de la catégorie avec la valeur en DB que vous nettoyez à la volée:
Je vous suggère de prendre le 2.2 approche. Prolonger votre DB tableau à deux colonnes:
vous pouvez également définir une contrainte unique sur la deuxième colonne, afin de ne pas arriver que deux de vos catégories (même s'ils ont différents noms d'affichage) aurait même URL noms conviviaux.
Comment nettoyer
La première chose qui vient à l'esprit est de supprimer des caractères non valides, mais c'est très fastidieux et vous aurez plus probablement de laisser quelque chose. Il est beaucoup plus facile et plus sage d'obtenir des caractères valides à partir de votre catégorie nom d'affichage. J'ai fait de même lors de la génération de mannequin URL noms de catégorie. Il suffit de prendre ce qui est valide et bin le reste. Il fonctionne généralement très bien. Deux exemples de telles expressions régulières:
(\w{2,})
- utilisez uniquement des lettres, des chiffres et des caractères de soulignement et au moins deux d'entre eux (si l'on exclut un ou le nombre de célibataires et similaire que ne pas ajouter de sens et inutilement allonge notre URL([a-zA-Z0-9]{2,})
- uniquement des lettres et des chiffres (2+)Obtenir tous les matches de votre catégorie nom d'affichage et de les joindre par un espace ou tiret et d'enregistrer le long de avec l'original du nom d'affichage. Un autre question de la mienne était exactement à ce sujet.
Pourquoi une colonne supplémentaire? Parce que vous ne pouvez pas exécuter une expression régulière dans SQL server. Si vous utilisez MySql, vous pouvez utiliser une colonne et d'utiliser une expression régulière sur DB.
OriginalL'auteur Robert Koritnik
Même si vous ne devriez pas le faire de cette façon...parfois il n'y a pas un moyen facile d'obtenir autour d'elle. requestPathInvalidCharacters sur le httpRuntime balise web.La Config est ce que vous cherchez. Il suffit d'entrer la commande suivante dans la <système.web> section:
<httpRuntime requestPathInvalidCharacters="<,>,*,%,:,\" />
Je encourageons vivement ce verrouillage vers le bas à l'aide de ce qui suit:
Juste de jeter dans la racine de la <configuration> tag. De la sorte...vous n'êtes pas à l'ouverture de l'ensemble de votre site pour permettre une esperluette dans le chemin...et peut-être d'exposer l'ensemble du site pour un imprévues attaque.
OriginalL'auteur Joe The Coder
Vous pouvez trouver les blog suivant utiles sur l'utilisation de caractères spéciaux dans les url. Mais en général, il est de bonne pratique de remplacer ces titres avec les limaces le même que StackOverflow fait avec les titres des questions dans l'url pour un meilleur RÉFÉRENCEMENT et l'utilisation des identifiants pour les identifier.
le
ValidateInput(false)
attribut est quand vous voulez POSTER en HTML à l'action d'un contrôleur. Dans ASP.NET MVC 3 vous pouvez décorer le modèle de vue de la propriété avec le[AllowHtml]
attribut de désactiver la validation de la demande uniquement pour cette propriété, ce qui est plus sûr. Vous n'avez pas besoin derequestValidationMode="2.0"
si vous utilisez leAllowHtml
attribut. Si vous voulez afficher des caractères spéciaux dans le cadre de l'url et un paramètre de route vous n'avez pas le choix, vous devez suivre les conseils du blog, je suis lié à.À moins qu'il change de catégorie de nommage, d'une certaine façon... en général ou uniquement lors de l'utilisation dans l'URL...
Koritnik, oui, c'est exactement l'une des deux solutions que j'ai proposé: pour utiliser les limaces.
Oui vous l'avez fait. Je suis d'accord. mais avec l'ajout de l'Id qui, de par mon avis, ne sont pas réalisables dans son cas, car de multiples catégories. Mais oui. Vous l'avez fait.
OriginalL'auteur Darin Dimitrov