Codificar array en Base64 & JSON en PHP, usarlo como atributo HTML y decodificar en JavaScript con escape adecuado

10 jun 2017, 05:55:19
Vistas: 16.9K
Votos: 1

Estoy buscando pasar un array arbitrario de PHP a JavaScript con un escape adecuado. Estoy considerando usar base64 y supongo que base64 no es seguro para atributos de datos, así que como buen desarrollador estoy usando esc_attr para los datos. ¿Existe una forma correcta de asegurarse de que los datos en base64 mantengan su integridad en JavaScript?

Aquí hay un ejemplo artificial (que funciona bien) porque esc_attr no modifica la integridad de la codificación 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>

En mi investigación encontré esta solución para manejar esto usando JSON, sin embargo, en mi caso no tengo una forma fácil de acceder a los datos usando una clave como atributo de datos.

0
Todas las respuestas a la pregunta 1
0

La posible salida de base64_encode() contiene a-zA-Z0-9+/ y posiblemente = o == al final.

Probando con

$str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';

encontramos que:

esc_attr( $str ) === $str 

es verdadero, por lo que parece que esc_attr() conserva las cadenas codificadas en base64.

Existen posibles expresiones regulares que pueden ayudar con la validación, pero según esta respuesta de @BoltClock, podríamos verificarlo con el segundo parámetro strict de:

base64_decode( $str, $strict = true )

Luego podríamos envolverlo en una función como:

function is_base64( $str )
{
    return base64_decode( $str, true) !== false;
}

para validarlo en PHP.

10 jun 2017 14:09:34