Codificare Base64 și JSON a unui array în PHP, utilizare ca atribut HTML de date, decodare și parsare în JavaScript cu escapare corectă
Caut să transmit un array arbitrar din PHP în JavaScript cu escapare corectă. Mă orientez spre utilizarea base64 și presupun că base64 nu este sigur pentru atributele de date, așa că, ca developer bun, folosesc esc_attr pentru date. Există o metodă corectă
de a mă asigura că datele base64 își păstrează integritatea în JavaScript?
Iată un exemplu construit - care funcționează bine - deoarece esc_attr nu modifică integritatea codificării 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>
În cercetarea mea, am dat peste această soluție pentru gestionarea acestui lucru folosind JSON - totuși, modul în care obțin datele nu îmi permite să chemez datele pentru a le prelua folosind cheia ca atribut de date.

Posibila ieșire a funcției base64_encode()
conține caracterele a-zA-Z0-9+/
și posibil =
sau ==
adăugate la sfârșit.
Testând cu:
$str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';
observăm că:
esc_attr( $str ) === $str
este adevărat, ceea ce înseamnă că esc_attr()
păstrează șirurile codificate în base64.
Există posibile expresii regulate care pot ajuta la validare, dar conform acestui răspuns de @BoltClock, am putea verifica folosind al doilea parametru strict al funcției:
base64_decode( $str, $strict = true )
Putem apoi încapsula acest lucru într-o funcție precum:
function is_base64( $str )
{
return base64_decode( $str, true) !== false;
}
pentru a valida în PHP.
