7
votes

Codage d'URL ASP.NET

Je suis en train de mettre en œuvre une réécriture d'URL dans ASP.NET et mes URL me causent un monde de problèmes.

L'URL est générée à partir d'une base de données des départements et des catégories. Je veux que les employés puissent ajouter des éléments à la base de données avec les caractères spéciaux appropriés sans casser le site.

J'encore les données avant de construire les URL.

Il y a plusieurs problèmes ...

  1. IIS décode l'URL avant qu'il ne atteigne .NET rendant impossible l'analyse correctement avec un "/" dedans.
  2. ASP.NET est confondu par l'URL faisant "~" inutile dans certaines pages
  3. J'ai migré du serveur de test intégré sur mon serveur IIS local (Machine XP) et toute URL contenant un codé et (% 26) me donne une erreur "mauvaise demande".
  4. UrlenCode laisse des caractères de rupture intacts tels que ""

    J'ai eu deux autres postes liés à ce sujet, à l'époque, je n'ai vu que les petits problèmes, pas le gros problème en amont. J'ai trouvé des astuces de registre pour résoudre le problème de la "mauvaise demande", mais je vais déployer un environnement d'hébergement partagé rendant cela inutile. Je sais aussi que ceci est une solution pour un problème de sécurité, donc je ne veux pas nécessairement le contourner sans savoir quelle boîte de vers que j'ouvrie.

    Plutôt que d'essayer de forcer .net à me transmettre l'URL brute ou à remplacer les paramètres IIS, je voudrais faire des URL vraiment sûres en premier lieu.

    Je vais noter que j'ai essayé Antixsss.urlencode, HTTTPUTILITY.URLENCODE, URI.ESCAPÉDRAING. J'ai même essayé des choses stupides comme la double urlencodng. Y a-t-il une utilité qui fait ce dont j'ai besoin ou que j'ai vraiment besoin de rouler le mien. J'imagine même à faire quelque chose de hacky comme en remplaçant le% avec une chaîne inhabituelle de caractères. Le résultat final devrait être au moins lisible, ce qui était le point d'utiliser une réécriture d'URL en premier lieu.

    Désolé pour le long post - je voulais juste m'assurer que j'ai inclus tous les détails nécessaires. Je ne peux pas sembler trouver des informations pertinentes à ce sujet, et cela semble être un problème commun - alors peut-être que je manque quelque chose de grand. Merci pour votre aide, et la patience avec la longue explication!


    Modifier pour plus de clarté:

    Lorsque je dis que les URL sont construites à partir d'une base de données ce que je veux dire, c'est que la structure de répertoires est contestée à partir des départements et des catégories de ma base de données.

    Quelques exemples d'URL -

    mystore / réfrigération / bar + réfrigérateur.aspx
    Mystore / cuisson + équipement.aspx
    Mystore / Cuisine / Coupe + Boards.ASXPX

    Les problèmes entrent lorsque j'utilise un département comme "boissons et barres" ou "pâtisseries / décorations" pour construire mon URL. En dépit d'être codé d'abord, celles-ci provoquent les problèmes susmentionnés.

    Mes gestionnaires sont déjà implémentés et fonctionnent bien, à l'exception des problèmes de codage de caractères spéciaux.


1 commentaires

Dans l'intérêt de la divulgation complète, voici mes autres postes liés - Stackoverflow.com/questions/1274669/... - Question similaire mais j'essayais de forcer .net à me donner l'URL d'origine plutôt que de fixer le codage sur le lien d'origine. Stackoverflow.com/ Questions / 1194900 / ... Essayer de résoudre le problème «~» Avant de réaliser qu'il y avait des problèmes plus importants.


4 Réponses :


2
votes

J'ai une URL REWRITE I Mise en œuvre dans le fichier global.asax dans la demande authentifiée de début, car j'ai une certaine sécurité. C'est là que je prends l'URL brute et puis le dB levez-vous. Cela réécrit ensuite le chemin d'accès à la page ASPX et tous les paramètres sont passés via la chaîne de requête. Aucun codage n'est nécessaire.

Toutefois, si vous utilisez l'URL pour modifier réellement des données, je peux voir que vous aurez des problèmes énormes car vous utilisez efficacement la base de données HTTP pour changer de base de données. Il est généralement reconnu une mauvaise idead, et pas quelque chose que je fais.

Je n'utilise qu'une requête postale pour effectuer une manipulation de la base de données. Cela empêche l'URL propre car toutes les données sont dans le formulaire de page.

Le seul problème que j'avais était de définir l'URL correcte sur la page.Form.action, qui est dans la plupart des cas l'URL brute.

Si ses noms de catégorie qui causent le problème, vous devez peut-être limiter les noms aux caractères numériques alpha et échangez des espaces pour "-". IIS jettera un obstacle avec des périodes "." comme il cherche des noms de fichiers.

P.s. IIS ne comprend pas l'tilde "~", c'est quelque chose que le compilateur comprend. Donc, si vous l'utilisez dans une balise d'ancrage, elle ne fonctionnera pas comme prévu et vous devez utiliser la racine de l'application au lieu de la tilde.

EDIT:

OK, cela ressemble à un problème avec IIS ayant des problèmes de certains caractères tels que. / et &. Même si vous faites UrlenCode, ces IIS essaieront toujours de mettre en œuvre ses propres significations. En tant que telle envisagez de les éliminer afin:

boisson et barre devient barre de boissons

pâtisserie / décoration devient pâtissier.

Cela vous conservera les URL propres, mais signifie une colonne supplémentaire dans la base de données afin que vous puissiez chier l'URL contre ce nom de catégorie raccourci.


3 commentaires

Désolé, j'aurais dû être plus clair, je ne fais pas de manipulation de base de données avec mes URL. Mon magasin est décomposé en départements et catégories. Plutôt que d'être codé dur, la structure de répertoires est construite à partir de la base de données. Les différents menus ont des liens de la forme mystore / département ou mystore / département / catégorie qui, tout en codé et techniquement correct, sont cassés par IIS avant que la demande ne le rend même à mon httphandler.


Cela pourrait être la meilleure solution. J'aurais peut-être juste de trop compliquer des choses. Mon seul préoccupation est que je vais avoir besoin de pouvoir rechercher des articles de l'URL pouvant être compliqué par une méthode non réversible d'encodage. Ma seule autre idée était d'utiliser Uri.escapedâtrage (B) .replace ("%", "_") que je suis assez sûr que je me condamnerait à m'avoir condamné à l'enfer programmable. Merci beaucoup pour vos réponses rapides et aidez-y à ce sujet. Je prends un autre regard sur mon code pour voir si cela fonctionnera.


Merci beaucoup pour votre aide. C'est l'un de ces moments où je suis profondément frustré de ne pouvoir accepter de multiples réponses. Tu m'as pointé dans la bonne direction et me suis retourné sur la bonne voie avec ça ... merci !!



5
votes

Vous devriez envisager d'avoir une table de votre table de catégorie / département qui a une URL unique pour chaque catégorie. Ensuite, vous pouvez utiliser une routine spéciale pour générer les URL. Cela peut être une fonction scalaire SQL, ou une fonction CLR, mais l'une des choses qu'elle ferait est de normaliser l'URL pour le Web. Vous pouvez convertir «boisson et barre de boisson» en «boissons et bar» et «pâtisserie / décoration» à «décorations de pâte». Principalement, la routine doit remplacer tous les caractères URL HTTP non valides avec quelque chose d'autre. Un exemple est-ce: xxx

Vous pouvez faire une fonction d'amélioration SQL ou exécuter la génération d'URL en tant que processus distinct. Ensuite, pour implémenter la mappage, vous feriez mapper la totalité de l'URL directement à un ID de catégorie. Cette approche est meilleure à long terme pour plusieurs raisons. Premièrement, vous ne générez pas toujours des URL, vous le faites une fois et qu'il reste statique, vous n'avez pas à vous soucier de votre procédure changeant, puis GoogleBot ne pouvant pas trouver de vieilles URL. De plus, si vous obtenez une collision, vous remarquerez peut-être un nom de catégorie duplicaté potentiel, car une collision ne serait différente que par des caractères spéciaux. Enfin, vous pouvez toujours afficher vos URL de la base de données, sans avoir à exécuter la fonction de mappage.


1 commentaires

C'est absolument parfait. Merci beaucoup, vous m'avez sauvé plus de temps que je me soucie d'admettre.



1
votes

J'ai exactement le même problème. Merci de l'avoir écrit si bien. Cela m'a vraiment aidé à mieux comprendre le problème.

J'ai eu d'autres considérations cependant. L'un des objectifs que j'ai consiste à soutenir le potentiel de tous les personnages d'être dans l'URL qui repose sur le titre d'un article. De plus, je souhaite assurer un caractère unique dans le codage et un processus de codage / décodage à deux voies. P>

Donc, j'ai fait un codage manuel pour résoudre le problème. Cela n'élimine pas complètement le codage en pourcentage, mais la réduira considérablement et conservera les utilisateurs de générer une URL inaccessible. Mon processus commence par l'utilisation de la fonction server.urlencode code>. Mais cela n'élimine pas les problèmes de l'URL. Étant donné que l'IIS décodage de l'URL puis la transmettra à l'application, certains caractères le briseront avec une exception de demande dangereuse. Ces caractères incluent + et, /,!, * ,., ( code> et ) code>. Donc, sur ces personnages, plus d'autres personnages, je voudrais gagner plus lisible, je fais un double codage pour une URL plus utilisable. Le codage est également difficile en raison du nombre limité de caractères autorisés dans une URL. Donc, avant de coder, j'ai fabriqué toutes les lettres majuscules, puis a fait le codage avec minuscule. Cela empêche d'être totalement décodable, mais je peux facilement faire une correspondance dans la base de données ou en code en faisant la valeur que je souhaite correspondre être majuscule. P>

Eh bien, voici mon code. Les commentaires seraient appréciés. OH YA, c'est dans VB, mais les choses devraient transférer à C # assez facile. P>

Dim strReturn As String = Trim(strStringToEncode)
strReturn = Server.UrlEncode(strReturn)

strReturn = strReturn.Replace("-", "dash").Replace("+", "-")

strReturn = strReturn.Replace("%26", "and").
                    Replace("%2f", "or").
                    Replace("!", "excl").
                    Replace("*", "star").
                    Replace("%27", "apos").
                    Replace("(", "lprn").
                    Replace(")", "rprn").
                    Replace("%3b", "semi").
                    Replace("%3a", "coln").
                    Replace("%40", "at").
                    Replace("%3d", "eq").
                    Replace("%2b", "plus").
                    Replace("%24", "dols").
                    Replace("%25", "pct").
                    Replace("%2c", "coma").
                    Replace("%3f", "query").
                    Replace("%23", "hash").
                    Replace("%5b", "lbrk").
                    Replace("%5d", "rbrk").
                    Replace(".", "dot").
                    Replace("%3e", "gt").
                    Replace("%3c", "lt")

Return strReturn


3 commentaires

Déjà trouvé un problème. L'URL Scan rejette la citation intelligente unique.


Trouvé de nombreuses citations qui font de l'Urlscan en colère. Cela aidera à le réparer. Remplacer ("% E2% 80% 89", "rsquo"). Remplacer ("% E2% 80% 88", "lsquo"). Remplacer ("% E2% 80% 9D", "rdquo"). Remplacer ("% E2% 80% 9c", "ldquo"). Remplacer ("% E2% 80% 9b", "lsrquo"). Remplacer ("% E2% 80% 9F", "LDRQUO").


Regardez les paramètres web.config comme DemandeFiltering allowdoubleescaping = "vrai" ( Stackoverflow.com/a/1453287 / 1178314 ) et httpruntime requestvalidationMode = "2.0" RelaxedurLtofilesystemMapping = "vrai" demandePathValidCaracters = "" . Dans mon cas d'utilisation, cela me permet de prendre en charge de nombreux autres caractères des URL.



0
votes

Je suppose que vous recherchez httTputetilité.urlencode et httTputilité.htmldecode xxx


1 commentaires

Merci pour l'information, bien que le problème soit plus que l'urlencode / décodage n'a pas fonctionné comme ASP.NET ou IIS rejetant toujours les URL codées. Je pense que j'ai fini par utiliser un système de substitution à la place, mais c'était un moment où je suis un peu flou.