適切にエスケープしながら、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を使用してこれを処理するためのこのソリューション - しかしデータ属性としてキーを使用してデータを取得するためにキーを入力する方法はありません.
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で検証する.