Кодирование массива в Base64 и JSON в PHP, использование как HTML data-атрибута, декодирование и разбор в JavaScript с правильным экранированием
Я хочу передать произвольный массив из PHP в JavaScript с правильным экранированием. Я склоняюсь к использованию base64, но предполагаю, что base64 не безопасен для data-атрибутов, поэтому как хороший разработчик я использую esc_attr для данных. Есть ли правильный
способ убедиться, что данные base64 сохранят свою целостность в JavaScript?
Вот искусственный пример — который работает нормально — потому что esc_attr не изменяет целостность 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>
В ходе исследований я наткнулся на это решение для обработки данных с помощью JSON, однако в моем случае получения данных у меня нет простого способа получить данные по ключу, используя ключ как data-атрибут.

Возможный вывод функции base64_encode()
содержит символы a-zA-Z0-9+/
и, возможно, добавленные =
или ==
.
Тестируя с
$str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';
мы видим, что:
esc_attr( $str ) === $str
возвращает true, что означает, что esc_attr()
сохраняет строки, закодированные в base64.
Существуют возможные регулярные выражения для проверки, но согласно ответу от @BoltClock, можно проверить это с помощью второго параметра strict функции:
base64_decode( $str, $strict = true )
Затем можно обернуть это в функцию, например:
function is_base64( $str )
{
return base64_decode( $str, true) !== false;
}
для валидации в PHP.
