7
votes

Comment encoder une URI pour stocker en toute sécurité dans la gaine d'une tableservice

Je voudrais vraiment, vraiment que de stocker une URI comme valeur de gaine dans la table de table Azure. Selon le Documentation , les tapêts ne peuvent pas contenir de caractères communément trouvés dans URIS (/, \, #,?).

La solution semble simple: codez simplement l'URI. Mais cela ne fonctionne pas. Pour une raison quelconque, toutes les valeurs contenant la séquence % 2f (la valeur codée pour une barre oblique) peut être insérée, mais non interrogée même si "% 2f" ne fait pas contenir des caractères interdits.

D'accord, alors que diriez-vous de l'encodage de base64? Non. Il produit le caractère de barre oblique occasionnelle, qui n'est pas autorisé.

Il y a donc une méthode d'encodage d'une chaîne (une URI) pouvant être stockée de manière fiable en tant que tapis de rangée dans une table d'azur? De préférence, mais pas nécessairement, quelque chose d'humain lisible.


0 commentaires

5 Réponses :


0
votes

Un couple Possibilités:

  1. Convertissez les octets en utilisant un encodage spécifique (par exemple, UTF-8), puis coder les octets comme hexagonal. Utilisez cela comme clé. Cependant, certaines URI peuvent être très longues et la clé sera encore plus longue, afin que vous puissiez courir dans la longueur maximale d'une gaine.
  2. hachage l'URI (par exemple, avec MD5). Hex encode ces octets et utilisez-les comme clé. Notez qu'il existe une chance de collisions, mais votre partitionkey peut supprimer cette chance. Étant donné que les hachages sont une longueur constante, vous ne devriez pas avoir de problèmes avec la longueur maximale de la gaine.

    Je suis sûr qu'il y a d'autres idées, je serai intéressé à les entendre.


0 commentaires

0
votes

Off Sujet Mais connexe: Je crée des tables de manière dynamique et que le code peut vous aider si vous en avez besoin, bien que les règles de tables et de pk / rk soient assez différentes. "^ [A-ZA-Z] [A-ZA-Z0-9] {2,62} $". "

Vous pouvez peut-être l'utiliser pour inspirer votre propre solution

décoder une chaîne xxx

méthode pour encoder une chaîne xxx


0 commentaires

0
votes

Remplacez tous les caractères de clé de ligne illégaux de l'URL (\, /,?) avec des caractères illégaux dans les URL (par exemple, <,>,%)


1 commentaires

Cela ne fonctionne pas car certaines séquences de caractères (sans papiers) ne sont pas autorisées. Une séquence connue est% 2f.



2
votes

Remplacement / avec _ Après avoir utilisé le codage de base64 devrait fonctionner. A obtenu cette suggestion de codage et décodage d'une chaîne qui peut avoir de budghes dedans


0 commentaires

0
votes
public static string Encode(string rawText)
    {
        return Regex.Replace(rawText, @"[/\?\:@\&=\+,\$]", delegate(Match m)
        {
            switch (m.Value)
            {
                case "/": return "{#sl}";
                case "?": return "{#qm}";
                case ":": return "{#cl}";
                case "@": return "{#at}";
                case "&": return "{#am}";
                case "=": return "{#eq}";
                case "+": return "{#pl}";
                case ",": return "{#cm}";
                case "$": return "{#dl}";

                default: return m.Value;
            }
        });
    }

public static string Decode(string encodedText)
    {
        return Regex.Replace(encodedText, @"\{#[a-z]{2}\}", delegate(Match m)
        {
            switch (m.Value)
            {
                case "{#sl}": return "/";
                case "{#qm}": return "?";
                case "{#cl}": return ":";
                case "{#at}": return "@";
                case "{#am}": return "&";
                case "{#eq}": return "=";
                case "{#pl}": return "+";
                case "{#cm}": return ",";
                case "{#dl}": return "$";

                default: return m.Value;
            }
        });
    }

1 commentaires

Cela permet startswith requêtes