Codifica Base64 & JSON di array in PHP, uso come attributo HTML data, decodifica e parsing in JavaScript con escape corretto
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.

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.
