Upload
fumito-mizuno
View
2.810
Download
1
Embed Size (px)
DESCRIPTION
WordCamp Kobe2013 の発表スライド。 WordPress は PHP でカスタマイズするため、自由度が高く、汎用性も高い。 一方で、カスタマイズする人がセキュリティに気を配る必要がある。 本発表では、テーマカスタマイズで起こりがちなクロスサイトスクリプティング(XSS、またはスクリプトインジェクションとも呼ぶ)を取り上げる。
Citation preview
安全なテーマ作成のための
PHPの知識
レスキューワーク株式会社代表取締役 水野 史土
http://www.rescuework.jp/
2013/6/15 WordCamp 神戸
自己紹介
PHP 製ソフトウェアのサポート/開発支援
WordPress での活動
● バグ修正● 日本語版の作成● ドキュメントの日本語化● フォーラムで回答● プラグイン作成&配布
WordPress と PHP
出力する関数 / しない関数
検索ワードを表示する
エスケープ処理を行う
WordPress は PHP でカスタマイズ
メリット● 自由度が高い
柔軟なカスタマイズができる外部サービスと連携しやすい
● 汎用性が高い
独自の設定が少ない他の PHP 製ソフトウェアでも応用できる
WordPress は PHP でカスタマイズ
デメリット● HTML と PHP が混在
1つのファイルが長くなりやすい分業がしにくい
● セキュリティ
テーマ作成者が対処する必要があるテーマだけでなく WP 全体に影響する
出力する関数 / しない関数
出力する関数 :関数が echo する
出力しない関数:関数が return する
関数により、echo したりしなかったりする
関数の引数で決められることもある
echo する関数の例 the_date
<?php the_date() ;?>と書くと「投稿日」を出力する
<?php $data = the_date() ;?>と書いても出力する($data への格納ではない)
echo しない関数の例 get_the_date
<?php get_the_date() ;?>と書いても「投稿日」を出力しない
<?php $data = get_the_date() ;?>と書くと「投稿日」を $data へ格納する
<?php echo get_the_date() ;?>と書くと「投稿日」を出力する
echo しない関数 => PHP で処理
例 : 「投稿日」を取得 => 表示形式を変更
● 「xx 日前」にする● 「New」を付ける● 「この記事は古いです」
単に画面表示するだけでなく、加工して出力できる
echoする / しないを調べる
ソースコード 又は Codex
管理画面で
ソースコードを確認する
プラグイン sourceview を利用
ユーザーが入力した
検索ワードを
ブログに表示したい
検索ワードを
どうやって取得するか
検索時の URL
http://example.com/?s=****** の部分を取得したい
$_GET['']
URL のクエリ部分(?の後)
検索等、ユーザーの入力したデータ
WP では、検索ワードは $_GET['s']
echo $_GET['s']; で出力
echo は、変数の値を出力する命令
検索ワード($_GET['s'] の値)を出力
これでOK!?
echo $_GET['s']; は危険
外部からの入力をそのまま出力する
<?php echo $_GET['s'];?>の検索結果
もし、検索語が
「<script>alert(document.cookie);</script>」だったとすると
<script>alert(document.cookie);</script>の検索結果
echo $_GET['s'];は
検索ワードの
<や>を
そのまま出力してしまう
検索ワードに
JavaScript↓
コードを実行してしまう
XSS(クロスサイトスクリプティング)
ユーザーの入力等をそのまま出力する↓
悪意あるユーザーがJavaScriptを混入させる
↓そのスクリプトが実行される
* JS が多いが、JS とは限らない
XSS 対策
出力をエスケープするHTMLタグ属性値はダブルクォートで括る
詳細は「体系的に学ぶ安全なWebアプリケーションの作り方」(徳丸浩)を参照
エスケープとは
<、>、&等の特殊な文字を無効化する
例: < を < にする
JavaScriptを混入された場合でも、
単に文字列として表示される
ユーザーの入力は
必ずエスケープしてから
出力する
自分でJavaScriptを
書かない場合でも
XSS 対策が必要
WordPress で
XSS 対策する
WP にはエスケープする関数がある
esc_htmlesc_attr
他にもある
http://wpdocs.sourceforge.jp/Data_Validation
echo esc_html($_GET['s']);
検索ワードを画面に表示する場合
<?php esc_html($_GET['s']);?>の検索結果
echo esc_attr($_GET['s']);
HTMLタグの属性値にする場合
<form>...<input name="s" value="<?php echo esc_attr($_GET['s']);?> />...</form>
WP の関数を使う
原則として、出力エスケープを考慮している
毎回 esc_*** を書く手間が無い
エスケープし忘れを防ぐ
多くのユーザーが使用しているので、未知のバグの可能性が低い
the_search_query();
検索ワードを出力する関数エスケープしてから出力するWP にバグが無い限り安全
WordPress に
バグはあるのか?
Twenty Twelve の脆弱性
入力を検証しないで echo していた
core.trac.wordpress.org/ticket/22690
core.trac.wordpress.org/ticket/22690
Twenty Twelve の脆弱性
入力を検証しないで echo していた
WordPress 3.5 リリース前に発見=>改善
オープンソースなので、多くの人がチェックし、気づいた人が改善
WordPress に
バグはあるのか?
バグはある
↓
気づいた人が修正できる
関数とエスケープの
話に戻ります
エスケープの有無は関数による
全ての関数がエスケープするわけではない
エスケープするかどうかを確認するCodex を読む
ソースコードを読む
esc_html は重ねても良い
二重エスケープしない
エスケープしているかどうか確信が無い場合、esc_html を通してから出力する
ただしパフォーマンスは低下する
WordPress の関数も、
エスケープするかどうか
確認してから使う
まとめ
ユーザーの入力はエスケープしてから出力する
属性値はダブルクォートで括る属性値に出力するときは esc_attr
関数によりエスケープの有無が異なる必ず確認してから使う
もっと知りたい方に
発展編ユーザー入力で HTML タグを認めたい
JavaScript にデータを渡したい
徳丸本を読む