23
6WordPress セキュリティを考える会 レスキューワーク株式会社 水野史土 http://www.rescuework.jp/ 201497コワーキングスペース茅場町

WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

Embed Size (px)

DESCRIPTION

WordPressセキュリティを考える会第6回資料 WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法について WordPressに限らず、ウェブアプリケーションでPHPからJavaScriptに値を渡したい場合はあるかと思います。 以下の方法を検証してみます。 1. data-XXX 属性の値に渡す 2. wp_localize_script 3. esc_js wp_localize_scriptは、内部でjson_encodeを使用しているが、HTMLエスケープはしないので注意が必要。 詳細は -> http://www.rescuework.jp/blog/wp_localize_script-json.html 2014-09-07(日)14:00 - 17:00 東京都中央区新川1-3-4 PAビル5F コワーキングスペース茅場町 コワーキングスペース茅場町

Citation preview

Page 1: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

第6回 WordPressセキュリティを考える会

レスキューワーク株式会社水野史土

http://www.rescuework.jp/2014年9月7日 コワーキングスペース茅場町

Page 2: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

自己紹介

水野 史土

レスキューワーク株式会社

WordPressで構築された

サイトの安全性診断/評価

テーマ/プラグインのセキュリティチェック

Page 3: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

活動報告1. WordPress本体の改善

wpdb::prepare (SQLを生成)の不適切な使い方

● 警告を表示する提案● WP3.9 に取り込まれる

https://core.trac.wordpress.org/changeset/27073

※ WordPressを安全に使えるように改善していく

Page 4: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

活動報告2. プラグインの改善

Login Rebuilder (ログインURLを変更)● CSRF(罠ページを閲覧すると改ざんされる● 開発者に報告、開発者が修正

http://jvn.jp/jp/JVN05329568/

※公式ディレクトリのプラグインを安全にしていく

Page 5: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

本日のネタ

WordPressからJavaScriptにデータを渡す

● スライドショー等の速度、エフェクト● テキスト(エラーメッセージ等)

※ネタは参加者アンケートで決定。Login Lockdownレビューは、別の機会に。

Page 6: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

良くない方法

<script> var mode= ‘<?php echo $mode;?>’,</script>

Page 7: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

良くない方法

<script> var mode= ‘<?php echo $mode;?>’,</script>

WordPress (PHP) から JavaScript にそのままデータを渡している不正なコードを出力する危険性がある

Page 8: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

データを渡す場合

データを渡す先を確認する

意図しない解釈をされないように、処理する

例: HTML < を &lt; > を &gt; 等

※渡す先によって、処理の仕方が異なる

Page 9: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

WordPress から JavaScript へ

直接渡す

=> JavaScript のエスケープ

ややこしいので、可能なら避ける

WPには「JSに直接渡す」以外の方法がある

Page 10: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

1. カスタムデータ属性を使う方法

HTMLタグに、data-*** という属性を作る

<ul class=”bxslider” data-mode=”vertical”>

jQueryで取得: $(”.bxslider”).data(”mode”);

Page 11: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

1. カスタムデータ属性を使う方法

WordPress -> HTML -> JavaScript

HTMLの属性値としてエスケープ: esc_attr

<ul class=”bxslider” data-mode=”<?php echo esc_attr($mode);?>”>

Page 12: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

1. カスタムデータ属性を使う方法

● メリット

ややこしいJSのエスケープではなく、HTMLの属性値として処理すればよい

● デメリット

大量のデータを渡すのは大変

HTML5が前提( input hidden で対処する?)

Page 13: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

2. wp_localize_scriptを使う方法

wp_localize_scriptに、データを渡す

$data = array( ’mode’ => ’vertical’);wp_localize_script(’slider’,’bxslider’,$data);

JSで取得する: bxslider.mode

Page 14: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

2. wp_localize_scriptを使う方法

wp_enqueue_scriptと組み合わせて使う

wp_enqueue_script(’slider’, JSファイル);$data = array( ’mode’ => ’vertical’);wp_localize_script(’slider’,’bxslider’,$data);

Page 15: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

2. wp_localize_scriptを使う方法

下記のようなコードをWPが出力する

<script type='text/javascript'>/* <![CDATA[ */var bxslider = {"mode":"vertical"};/* ]]> */</script>

Page 16: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

2. wp_localize_scriptを使う方法

WordPress -> JSON -> JavaScript

wp_localize_scriptが、JSONに変換してくれる

※HTMLタグをエスケープしない

json_encodeのオプションはPHP5.3以降

WPはPHP5.2以降をサポートしている

Page 17: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

2. wp_localize_scriptを使う方法

● メリット

ややこしいJSのエスケープではなく、wp_localize_scriptにデータを渡せば良い

● デメリット

HTMLエスケープしないので、JS側で出力するときはクロスサイトスクリプティングに注意http://www.rescuework.jp/blog/wp_localize_script-json.html

Page 18: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

3. esc_jsを使う方法

esc_js が < > & ’ ” をエスケープする

var mode = ’<?php echo esc_js($mode);?>’,

※JavaScript側では何もしない

Page 19: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

3. esc_jsを使う方法

WordPress -> JavaScript

データを渡すほか、JS自体を動的生成できる

※脆弱性がある場合、被害が甚大

データを渡す目的で使うのは避ける

Page 20: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

3. esc_jsを使う方法

● メリット

JavaScriptの書き換えが最小限ですむ

● デメリット

JSのエスケープ処理が必要

脆弱性がある場合、被害が甚大

Page 21: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

JS 側での入力検証

スライダーの表示モード

● 特定の文字列のみ受け付ける

horizontal, vertical 等

※入力検証処理を書くのが好ましい

(時間の都合で今回は省略)

Page 22: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

情報の入手方法?

安全なコーディングのために

● 公式ドキュメント (Codex)

● 公式テーマを学ぶ

Twenty Fourteen テーマで、wp_localize_scriptを使用しているhttps://themes.trac.wordpress.org/browser/twentyfourteen/1.2/functions.php#L251

Page 23: WordPress(PHP) からjQuery(JavaScript)に動的に値を渡す方法

連載書籍 「WordPress セキュリティニュース」

WordPressセキュリティ情報

海外情報

独自ネタ(Login Rebuilder など)

http://www.iineshoten.com/story/114/