Passage de chaînes codées en base64 dans L'URL

Est-il sûr de passer des chaînes codées en base64 brutes via les paramètres GET?

197
demandé sur Alix Axel 2009-09-03 21:12:08

9 réponses

Non, vous devez l'encoder en url, car les chaînes base64 peuvent contenir les caractères"+", " = " et " / " qui pourraient modifier la signification de vos données - ressembler à un sous-dossier.

Les caractères base64 valides sont ci-dessous.

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
169
répondu Thiyagaraj 2009-09-03 17:19:01

Il existe des spécifications base64 supplémentaires. (Voir le tableau ici pour plus de détails ). Mais essentiellement, vous avez besoin de 65 caractères pour encoder: 26 minuscules + 26 majuscules + 10 chiffres = 62.

Vous avez besoin de deux autres [ ' + ' ,'/'] et un padding char'='. Mais aucun d'entre eux n'est convivial pour les url, donc utilisez simplement des caractères différents pour eux et vous êtes prêt. Les standards du tableau ci-dessus sont ['-', '_'], mais vous pouvez utiliser d'autres caractères tant que vous les avez décodés de la même manière, et n'avez pas besoin de partager avec les autres.

Je recommande juste d'écrire vos propres aides. Comme ceux-ci des commentaires sur la page de manuel php pour base64_encode :

function base64_url_encode($input) {
 return strtr(base64_encode($input), '+/=', '._-');
}

function base64_url_decode($input) {
 return base64_decode(strtr($input, '._-', '+/='));
}
231
répondu Joe Flynn 2017-07-17 14:16:45

@ joeshmo ou au lieu d'écrire une fonction d'assistance, vous pouvez simplement urlencode la chaîne codée en base64. Cela ferait exactement la même chose que votre fonction d'aide, mais sans avoir besoin de deux fonctions supplémentaires.

$str = 'Some String';

$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );
65
répondu rodrigo-silveira 2011-12-21 18:45:24

Note D'Introduction je suis enclin à poster quelques clarifications puisque certaines des réponses ici étaient un peu trompeuses (sinon incorrectes).

La réponse est non , Vous ne pouvez pas simplement passer un paramètre codé en base64 dans une chaîne de requête URL puisque les signes plus sont convertis en un espace dans le tableau global $_GET. En d'autres termes, si vous avez envoyé test.le php?myVar = stringwith + signe à

//test.php
print $_GET['myVar'];

Le résultat serait être:
stringwith sign

Le moyen le plus simple de résoudre ce problème est de simplement urlencode() votre chaîne base64 avant de l'ajouter à la chaîne de requête pour échapper les caractères+, = et / aux codes%##. Par exemple, urlencode("stringwith+sign") renvoie stringwith%2Bsign

Lorsque vous traitez L'action, PHP s'occupe de décoder automatiquement la chaîne de requête lorsqu'elle remplit le global $_GET. Par exemple, si j'ai envoyé test.le php?myVar = stringwith%2Bsign à

//test.php
print $_GET['myVar'];

, Le résultat est:
stringwith+sign

C'est vrai Pas voulez urldecode() la chaîne $_GET retournée comme +sera convertie en espaces.
En d'autres termes, si j'ai envoyé le même test .le php?myVar = stringwith%2Bsign à

//test.php
$string = urldecode($_GET['myVar']);
print $string;

Le résultat est inattendu:
stringwith sign

, Il serait à l'abri de rawurldecode() l'entrée, cependant, il serait redondant et donc inutile.

38
répondu Jeffory J. Beckers 2016-07-06 16:17:26

Oui et non.

Le jeu de caractères de base de base64 peut dans certains cas entrer en collision avec les conventions traditionnelles utilisées dans les URL. Mais beaucoup d'implémentations base64 vous permettent de changer le jeu de caractères pour mieux correspondre aux URL ou même en venir avec un (comme celui de Python urlsafe_b64encode()).

Un autre problème auquel vous pourriez être confronté est la limite de longueur D'URL ou plutôt-l'absence d'une telle limite. Parce que les normes ne spécifient aucune longueur maximale, navigateurs, serveurs, bibliothèques et autres logiciels fonctionnant avec HTTP protocole peut définir ses propres limites. Vous pouvez jeter un oeil à cet article: WWW FAQ: Quelle est la longueur maximale d'une URL?

13
répondu Michał Górny 2009-09-03 17:20:40

C'est un encodage base64url que vous pouvez essayer, c'est juste une extension du code de joeshmo ci-dessus.

function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

function base64url_decode($data) {
return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
}
5
répondu Andy 2015-07-21 08:31:48

Je ne pense pas que ce soit sûr car par exemple le caractère "=" est utilisé dans la base brute 64 et est également utilisé pour différencier les paramètres des valeurs dans un HTTP GET.

4
répondu Mischa 2009-09-03 17:18:25

En théorie, oui, tant que vous ne dépassez pas la longueur maximale de la chaîne de requête url et/oor pour le client ou le serveur.

En pratique, les choses peuvent devenir un peu plus délicates. Par exemple, il peut déclencher une exception HttpRequestValidationException sur ASP.NET si la valeur contient un " on " et que vous laissez dans la fin "==".

1
répondu Nicole Calinoiu 2009-09-03 17:22:52

Oui, c'est toujours sûr. bien sûr base64 contient: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= mais une chaîne codée en base64 n'a généralement pas +. + sera converti en un espace vide, entraîne une mauvaise chaîne décodée. / est sûr dans une paire de paramètres get. = est toujours à la fin de la chaîne encodée en base64 et le côté serveur peut résoudre = directement.

-4
répondu gouchaoer 2017-02-06 09:13:32