Codifica Base64 & JSON di array in PHP, uso come attributo HTML data, decodifica e parsing in JavaScript con escape corretto

10 giu 2017, 05:55:19
Visualizzazioni: 16.9K
Voti: 1

Sto cercando di passare un array arbitrario da PHP a JavaScript effettuando l'escape correttamente. Penso di usare base64 e immagino che base64 non sia sicuro per gli attributi data, quindi come buon sviluppatore sto usando esc_attr sui dati. Esiste un modo corretto per assicurarsi che i dati base64 mantengano la loro integrità in JavaScript?

Ecco un esempio costruito - che funziona bene - perché esc_attr non modifica l'integrità della codifica 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>

Nella mia ricerca ho trovato questa soluzione per gestire il problema usando JSON - tuttavia nel modo in cui ottengo i dati non ho un modo semplice per chiavare i dati per recuperarli usando la chiave come attributo data.

0
Tutte le risposte alla domanda 1
0

L'output possibile di base64_encode() contiene a-zA-Z0-9+/ e possibilmente = o == aggiunti alla fine.

Testando con

$str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';

scopriamo che:

esc_attr( $str ) === $str 

è vero, quindi sembra che esc_attr() preservi le stringhe codificate in base64.

Esistono possibili regex per aiutare con la validazione, ma secondo questa risposta di @BoltClock, potremmo verificarlo con il secondo parametro strict di:

base64_decode( $str, $strict = true )

Potremmo poi racchiuderlo in una funzione come:

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

per validarlo in PHP.

10 giu 2017 14:09:34