web-dev-qa-db-fra.com

Base64 & JSON Encoder tableau en PHP, utiliser comme attribut de données HTML, décoder et analyser en JavaScript .... avec l'échappement approprié

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.

1
setterGetter

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.

1
birgire