Je cherche à passer un tableau arbitraire de PHP à JavaScript tout en évitant correctement. Je me penche sur l’utilisation de base64 et j’imagine que celui-ci n’est pas sûr pour les attributs de données. Par conséquent, en tant que bon développeur, je suis esc_attr les données. Existe-t-il un moyen right
de s'assurer que les données base64 conservent leur intégrité en JavaScript?
Voici un exemple artificiel - cela fonctionne bien - car esc_attr ne modifie pas l'intégrité du codage base64.
<?php
$array = [
[
'the' => 'quick',
'brown' => 'fox'
],
[
'test' => 'test',
'foo' => 'bar'
]
];
$values_json = base64_encode( json_encode( $array ) );
?>
<input id="check" type="checkbox" data-value="<?php esc_attr_e( $values_json ); ?>"> Foobar
<script>
var checkbox = document.getElementById(id);
checkbox.addEventListener('click',
function () {
console.log(JSON.parse(atob(this.dataset.value)));
}
);
</script>
Dans mes recherches, je suis tombé sur cette solution permettant de gérer cela à l'aide de JSON -, mais comme je reçois les données, je n'ai pas de moyen facile de les saisir pour les récupérer en utilisant la clé comme attribut de données.
La sortie possible de base64_encode()
contient a-zA-Z0-9+/
et éventuellement =
ou ==
ajouté.
Test avec
$str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';
nous constatons que:
esc_attr( $str ) === $str
est vrai, il semble donc que esc_attr()
préserve les chaînes codées en base64.
Il y a des expressions rationnelles possibles pour aider à la validation, mais selon ce answer by @BoltClock, nous pourrions le vérifier avec le second paramètre strict de:
base64_decode( $str, $strict = true )
Nous pourrions ensuite l'envelopper dans une fonction comme:
function is_base64( $str )
{
return base64_decode( $str, true) !== false;
}
pour le valider en PHP.