web-dev-qa-db-ja.com

Base64およびJSON PHPで配列をエンコードし、HTMLデータ属性として使用し、JavaScriptでデコードおよび解析します。適切なエスケープ処理を行います。

適切にエスケープしながら、PHPからJavaScriptに任意の配列を渡します。私はbase64の使用に頼っていますし、base64はデータ属性に対して安全ではないと思いますので、良い開発者として私はデータをesc_attrしています。 base64データがJavaScriptでその整合性を維持することを確認するためのright方法はありますか?

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を使用してこれを処理するためのこのソリューション - しかしデータ属性としてキーを使用してデータを取得するためにキーを入力する方法はありません.

1
setterGetter

base64_encode()の可能な出力はa-zA-Z0-9+/を含み、おそらく=または==が追加されています。

でテストする

$str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';

私たちはそれを見つけます:

esc_attr( $str ) === $str 

trueなので、esc_attr()はbase64でエンコードされた文字列を保持しているように見えます。

バリデーションを助けるために 可能な正規表現 がありますが、この answer による@BoltClockによると、 strict の2番目のパラメータでそれをチェックできます

base64_decode( $str, $strict = true )

それを次のような関数にラップすることができます。

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

pHPで検証する.

1
birgire