Кодирование массива в Base64 и JSON в PHP, использование как HTML data-атрибута, декодирование и разбор в JavaScript с правильным экранированием

10 июн. 2017 г., 05:55:19
Просмотры: 16.9K
Голосов: 1

Я хочу передать произвольный массив из 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-атрибут.

0
Все ответы на вопрос 1
0

Возможный вывод функции 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.

10 июн. 2017 г. 14:09:34