Je veux décoder une chaîne encodée en Base64, puis la stocker dans ma base de données. Si l'entrée n'est pas codée en Base64, je dois envoyer une erreur.
Comment puis-je vérifier si une chaîne de caractères est encodée en Base64 ?
Je veux décoder une chaîne encodée en Base64, puis la stocker dans ma base de données. Si l'entrée n'est pas codée en Base64, je dois envoyer une erreur.
Comment puis-je vérifier si une chaîne de caractères est encodée en Base64 ?
Vous pouvez utiliser l'expression régulière suivante pour vérifier si une chaîne constitue un encodage base64 valide :
^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$
En codage base64, le jeu de caractères est le suivant [A-Z, a-z, 0-9, and + /]
. Si la longueur restante est inférieure à 4, la chaîne est complétée par '='
des personnages.
^([A-Za-z0-9+/]{4})*
signifie que la chaîne commence par 0 ou plusieurs groupes base64.
([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$
signifie que la chaîne se termine par l'une des trois formes suivantes : [A-Za-z0-9+/]{4}
, [A-Za-z0-9+/]{3}=
o [A-Za-z0-9+/]{2}==
.
Je voulais juste vérifier, alors aidez-moi avec ma question : Quelle est la garantie que cette regex se réfère toujours à une chaîne de caractères en base64 ? S'il y a une chaîne sans espace et multiple de 4 caractères, alors cette chaîne sera-t-elle considérée comme une chaîne base64 ????
Il s'agit alors d'une chaîne base64 valide qui peut être décodée. Vous pourriez ajouter une contrainte de longueur minimale ; par exemple, au lieu de zéro ou plus répétitions de groupes de quatre, exigez (disons) quatre ou plus. Cela dépend aussi de votre problème ; si vos utilisateurs saisissent souvent un seul mot dans une langue avec des mots longs et de l'ASCII pur (hawaïen ?), il y a plus d'erreurs que si la saisie non-base64 contient généralement des espaces, de la ponctuation, etc.
@Didier Ghys il semble que cette chaîne encodée en base64 IHRlc3QgbWVzc2FnZQoK
ne correspond pas à la regex. Ou peut-être qu'il n'est pas codé en base64 ? bien que base64_decode('IHRlc3QgbWVzc2FnZQoK') produise une chaîne écrite - test message
Si vous utilisez Java, vous pouvez en fait utiliser commons-codec bibliothèque
import org.apache.commons.codec.binary.Base64;
String stringToBeChecked = "...";
boolean isBase64 = Base64.isArrayByteBase64(stringToBeChecked.getBytes());
[UPDATE 1] Avis de dépréciation Utilisez plutôt
Base64.isBase64(valeur) ;
/**
* Tests a given byte array to see if it contains only valid characters within the Base64 alphabet. Currently the
* method treats whitespace as valid.
*
* @param arrayOctet
* byte array to test
* @return {@code true} if all bytes are valid characters in the Base64 alphabet or if the byte array is empty;
* {@code false}, otherwise
* @deprecated 1.5 Use {@link #isBase64(byte[])}, will be removed in 2.0.
*/
@Deprecated
public static boolean isArrayByteBase64(final byte[] arrayOctet) {
return isBase64(arrayOctet);
}
De la documentation : isArrayByteBase64(byte[] arrayOctet)
Déprécié. 1.5 Utilisation isBase64(byte[])
sera supprimé dans la version 2.0.
Vous pouvez également utiliser Base64.isBase64(String base64) au lieu de le convertir vous-même en tableau d'octets.
Malheureusement, d'après la documentation : commons.apache.org/proper/commons-codec/apidocs/org/apache/ : "Teste une chaîne donnée pour voir si elle ne contient que des caractères valides dans l'alphabet Base64. Actuellement, la méthode traite les espaces blancs comme valides." Cela signifie que cette méthode a quelques faux positifs comme les "espaces blancs" ou les nombres ("0", "1").
Et bien tu peux :
Si vous vous attendez à ce qu'il sera soit en base64, alors vous pouvez probablement utiliser n'importe quelle bibliothèque disponible sur votre plateforme pour essayez pour le décoder en un tableau d'octets, en levant une exception s'il n'est pas valide en base 64. Cela dépend de votre plate-forme, bien sûr.
L'analyse syntaxique diffère de la validation au moins par le fait qu'elle nécessite de la mémoire pour le tableau d'octets décodés. Ce n'est donc pas l'approche la plus efficace dans certains cas.
Essayez comme ceci pour PHP5
//where $json is some data that can be base64 encoded
$json=some_data;
//this will check whether data is base64 encoded or not
if (base64_decode($json, true) == true)
{
echo "base64 encoded";
}
else
{
echo "not base64 encoded";
}
Utilisez ceci pour PHP7
//$string parameter can be base64 encoded or not
function is_base64_encoded($string){
//this will check if $string is base64 encoded and return true, if it is.
if (base64_decode($string, true) !== false){
return true;
}else{
return false;
}
}
Cela ne fonctionnera pas. lisez la documentation Returns FALSE if input contains character from outside the base64 alphabet.
base64_decode
Vérifier pour voir SI la longueur de la chaîne est un multiple de 4. Ensuite, utilisez cette regex pour vous assurer que tous les personnages dans la chaîne sont des caractères en base64.
\A[a-zA-Z\d\/+]+={,2}\z
Si la bibliothèque que vous utilisez ajoute une nouvelle ligne pour respecter la règle des 76 caractères maximum par ligne, remplacez-les par des chaînes vides.
Désolé @AnkurKumar mais c'est ce qui arrive quand les gens ont des URLs pas cool : elles changent tout le temps. Je n'ai aucune idée de l'endroit où il a été déplacé. J'espère que vous trouverez d'autres ressources utiles grâce à Google
Vous pouvez toujours récupérer les anciennes pages sur web.archive.org - voici l'url d'origine. web.archive.org/web/20120919035911/http://… ou j'ai posté le texte ici : gist.github.com/mika76/d09e2b65159e435e7a4cc5b0299c3e84
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
1 votes
Pourquoi ? Comment la situation peut-elle se présenter ?
2 votes
Sans préciser le langage de programmation (et/ou) le système d'exploitation que vous visez, la question est très ouverte.
7 votes
Tout ce que vous pouvez déterminer est que la chaîne ne contient que des caractères valides pour une chaîne codée en base64. Il se peut qu'il ne soit pas possible de déterminer que la chaîne est la version codée en base64 de certaines données. par exemple
test1234
est une chaîne valide codée en base64, et lorsque vous la décodez, vous obtenez quelques octets. Il n'y a aucun moyen indépendant de l'application de conclure quetest1234
n'est pas une chaîne codée en base64.0 votes
play.golang.org/p/RnEBFCJ9h0