Détecter l'encodage base64 en PHP?
Est-il un moyen de détecter si une chaîne a été base64_encoded() en PHP?
Nous convertir une partie de la mémoire de texte brut en base64 et une partie de elle vit dans un cookie qui doit être mis à jour. Je voudrais réinitialiser leur cookie si le texte n'a pas encore été codé, sinon le laisser seul.
Vous devez vous connecter pour publier un commentaire.
Mes excuses pour ce retard de réponse à déjà répondu à la question, mais je ne pense pas que base64_decode($x,true) est une assez bonne solution pour ce problème. En fait, il peut ne pas être une très bonne solution qui fonctionne à l'encontre de toute donnée d'entrée. Par exemple, je peux mettre beaucoup de mauvaises valeurs dans $x et ne pas se faire une fausse valeur de retour.
Je pense qu'en plus de la stricte valeur de retour de l'entrée, vous auriez également besoin de faire de la post-décoder la validation. Le moyen le plus fiable est si vous pouviez décoder et vérifier ensuite contre un ensemble de valeurs possibles.
Plus générale de la solution avec moins de 100% de précision (à rapprocher des chaînes plus longues, inexacte pour les chaînes courtes) si vous vérifiez votre sortie pour voir si beaucoup sont en dehors de la fourchette normale de l'utf-8 (ou quel que soit l'encodage que vous utilisez) caractères.
Voir cet exemple:
Résultats:
Sorte que vous pouvez faire quelque chose comme ceci:
Vous devriez probablement utiliser la moyenne() de la décodé valeurs au lieu de le max(), j'ai simplement utilisé le max() dans cet exemple, car il n'y a malheureusement pas construite en moyenne() en PHP. Quelle est la mesure que vous utilisez (moyenne,max,...) à l'encontre de ce seuil (200 par exemple) dépend de l'estimation de votre profil d'utilisation.
En conclusion, le seul coup gagnant n'est pas de jouer. Je voudrais essayer d'éviter d'avoir à discerner base64 en premier lieu.
J'ai eu le même problème, j'ai fini avec cette solution:
aaaa
,aaa2
etabcd
il est également livré truehttp://php.net/manual/en/function.base64-decode.php#81425
is_base64_encoded("a398UIhnj43f/1!+sadfh3w84hduihhjw=="); // true
renvoie la valeur FALSE dans mes tests.On peut combiner trois choses en une fonction pour vérifier si une chaîne donnée est valable en base 64 codé ou pas.
J'étais sur le point de construire un base64 bascule en php, c'est ce que j'ai fait:
Il fonctionne parfaitement pour moi.
Voici ma pensée sur elle: http://www.albertmartin.de/blog/code.php/19/base64-detection
Et ici, vous pouvez essayer: http://www.albertmartin.de/tools
base64_decode() ne retourne FALSE si l'entrée n'est pas valide des données encodées en base64. Utilisation
imap_base64()
au lieu de cela, elle retourne FALSE si $texte contient des caractères en dehors de l'alphabet Base64imap_base64() Référence
Voici ma solution:
if(empty(htmlspecialchars(base64_decode($string, true)))) {
return false;
}
Il retourne false si le décodé
$string
est pas valide, par exemple: "nœud", "123", " ", etc.Généralement un texte en base64 n'a pas d'espaces.
J'ai utilisé cette fonction qui a bien fonctionné pour moi. Il teste si le nombre d'espaces dans la chaîne de caractères est inférieur à 1 sur 20.
e.g: au moins 1 place par tranche de 20 caractères --- ( espaces /strlen ()) < 0.05
Il est peut-être pas exactement ce que vous avez demandé. Mais espère que ça vous sera utile pour quelqu'un.
Dans mon cas, la solution a été d'encoder toutes les données avec json_encode et puis base64_encode.
cette valeur peut être stocké ou utilisé tout ce dont vous avez besoin.
Puis de vérifier si cette valeur n'est pas seulement une chaîne de texte, mais vos données codées, vous utilisez simplement
ou sinon
Merci pour toutes les réponses précédentes auteurs dans ce thread:)
Votre meilleure option est:
Mieux vaut tard que jamais: Vous pourriez peut-être utiliser
mb_detect_encoding()
pour savoir si la chaîne codée semble avoir été une sorte de texte: