48
安全なテーマ作成のための PHPの知識 レスキューワーク株式会社 代表取締役 水野 史土 http://www.rescuework.jp/ 2013/6/15 WordCamp 神戸

安全なテーマ作成のためのPHPの知識

Embed Size (px)

DESCRIPTION

WordCamp Kobe2013 の発表スライド。 WordPress は PHP でカスタマイズするため、自由度が高く、汎用性も高い。 一方で、カスタマイズする人がセキュリティに気を配る必要がある。 本発表では、テーマカスタマイズで起こりがちなクロスサイトスクリプティング(XSS、またはスクリプトインジェクションとも呼ぶ)を取り上げる。

Citation preview

Page 1: 安全なテーマ作成のためのPHPの知識

安全なテーマ作成のための

PHPの知識

レスキューワーク株式会社代表取締役 水野 史土

http://www.rescuework.jp/

2013/6/15 WordCamp 神戸

Page 2: 安全なテーマ作成のためのPHPの知識

自己紹介

PHP 製ソフトウェアのサポート/開発支援

WordPress での活動

● バグ修正● 日本語版の作成● ドキュメントの日本語化● フォーラムで回答● プラグイン作成&配布

Page 3: 安全なテーマ作成のためのPHPの知識

WordPress と PHP

出力する関数 / しない関数

検索ワードを表示する

エスケープ処理を行う

Page 4: 安全なテーマ作成のためのPHPの知識

WordPress は PHP でカスタマイズ

メリット● 自由度が高い

柔軟なカスタマイズができる外部サービスと連携しやすい

● 汎用性が高い

独自の設定が少ない他の PHP 製ソフトウェアでも応用できる

Page 5: 安全なテーマ作成のためのPHPの知識

WordPress は PHP でカスタマイズ

デメリット● HTML と PHP が混在

1つのファイルが長くなりやすい分業がしにくい

● セキュリティ

テーマ作成者が対処する必要があるテーマだけでなく WP 全体に影響する

Page 6: 安全なテーマ作成のためのPHPの知識

出力する関数 / しない関数

出力する関数 :関数が echo する

出力しない関数:関数が return する

関数により、echo したりしなかったりする

関数の引数で決められることもある

Page 7: 安全なテーマ作成のためのPHPの知識

echo する関数の例 the_date

<?php the_date() ;?>と書くと「投稿日」を出力する

<?php $data = the_date() ;?>と書いても出力する($data への格納ではない)

Page 8: 安全なテーマ作成のためのPHPの知識

echo しない関数の例 get_the_date

<?php get_the_date() ;?>と書いても「投稿日」を出力しない

<?php $data = get_the_date() ;?>と書くと「投稿日」を $data へ格納する

<?php echo get_the_date() ;?>と書くと「投稿日」を出力する

Page 9: 安全なテーマ作成のためのPHPの知識

echo しない関数 => PHP で処理

例 : 「投稿日」を取得 => 表示形式を変更

● 「xx 日前」にする● 「New」を付ける● 「この記事は古いです」

単に画面表示するだけでなく、加工して出力できる

Page 10: 安全なテーマ作成のためのPHPの知識

echoする / しないを調べる

ソースコード 又は Codex

Page 11: 安全なテーマ作成のためのPHPの知識

管理画面で

ソースコードを確認する

Page 12: 安全なテーマ作成のためのPHPの知識

プラグイン sourceview を利用

Page 13: 安全なテーマ作成のためのPHPの知識

ユーザーが入力した

検索ワードを

ブログに表示したい

Page 14: 安全なテーマ作成のためのPHPの知識

検索ワードを

どうやって取得するか

Page 15: 安全なテーマ作成のためのPHPの知識

検索時の URL

http://example.com/?s=****** の部分を取得したい

Page 16: 安全なテーマ作成のためのPHPの知識

$_GET['']

URL のクエリ部分(?の後)

検索等、ユーザーの入力したデータ

WP では、検索ワードは $_GET['s']

Page 17: 安全なテーマ作成のためのPHPの知識

echo $_GET['s']; で出力

echo は、変数の値を出力する命令

検索ワード($_GET['s'] の値)を出力

Page 18: 安全なテーマ作成のためのPHPの知識

これでOK!?

Page 19: 安全なテーマ作成のためのPHPの知識

echo $_GET['s']; は危険

外部からの入力をそのまま出力する

<?php echo $_GET['s'];?>の検索結果

Page 20: 安全なテーマ作成のためのPHPの知識

もし、検索語が

「<script>alert(document.cookie);</script>」だったとすると

<script>alert(document.cookie);</script>の検索結果

Page 21: 安全なテーマ作成のためのPHPの知識
Page 22: 安全なテーマ作成のためのPHPの知識

echo $_GET['s'];は

検索ワードの

<や>を

そのまま出力してしまう

Page 23: 安全なテーマ作成のためのPHPの知識

検索ワードに

JavaScript↓

コードを実行してしまう

Page 24: 安全なテーマ作成のためのPHPの知識

XSS(クロスサイトスクリプティング)

ユーザーの入力等をそのまま出力する↓

悪意あるユーザーがJavaScriptを混入させる

↓そのスクリプトが実行される

* JS が多いが、JS とは限らない

Page 25: 安全なテーマ作成のためのPHPの知識

XSS 対策

出力をエスケープするHTMLタグ属性値はダブルクォートで括る

詳細は「体系的に学ぶ安全なWebアプリケーションの作り方」(徳丸浩)を参照

Page 26: 安全なテーマ作成のためのPHPの知識

エスケープとは

<、>、&等の特殊な文字を無効化する

例: < を &lt; にする

JavaScriptを混入された場合でも、

単に文字列として表示される

Page 27: 安全なテーマ作成のためのPHPの知識

ユーザーの入力は

必ずエスケープしてから

出力する

Page 28: 安全なテーマ作成のためのPHPの知識

自分でJavaScriptを

書かない場合でも

XSS 対策が必要

Page 29: 安全なテーマ作成のためのPHPの知識

WordPress で

XSS 対策する

Page 30: 安全なテーマ作成のためのPHPの知識

WP にはエスケープする関数がある

esc_htmlesc_attr

他にもある

http://wpdocs.sourceforge.jp/Data_Validation

Page 31: 安全なテーマ作成のためのPHPの知識

echo esc_html($_GET['s']);

検索ワードを画面に表示する場合

<?php esc_html($_GET['s']);?>の検索結果

Page 32: 安全なテーマ作成のためのPHPの知識

echo esc_attr($_GET['s']);

HTMLタグの属性値にする場合

<form>...<input name="s" value="<?php echo esc_attr($_GET['s']);?> />...</form>

Page 33: 安全なテーマ作成のためのPHPの知識

WP の関数を使う

原則として、出力エスケープを考慮している

毎回 esc_*** を書く手間が無い

エスケープし忘れを防ぐ

多くのユーザーが使用しているので、未知のバグの可能性が低い

Page 34: 安全なテーマ作成のためのPHPの知識

the_search_query();

検索ワードを出力する関数エスケープしてから出力するWP にバグが無い限り安全

Page 35: 安全なテーマ作成のためのPHPの知識

WordPress に

バグはあるのか?

Page 36: 安全なテーマ作成のためのPHPの知識

Twenty Twelve の脆弱性

入力を検証しないで echo していた

Page 37: 安全なテーマ作成のためのPHPの知識

core.trac.wordpress.org/ticket/22690

Page 38: 安全なテーマ作成のためのPHPの知識

core.trac.wordpress.org/ticket/22690

Page 39: 安全なテーマ作成のためのPHPの知識
Page 40: 安全なテーマ作成のためのPHPの知識

Twenty Twelve の脆弱性

入力を検証しないで echo していた

WordPress 3.5 リリース前に発見=>改善

オープンソースなので、多くの人がチェックし、気づいた人が改善

Page 41: 安全なテーマ作成のためのPHPの知識

WordPress に

バグはあるのか?

Page 42: 安全なテーマ作成のためのPHPの知識

バグはある

気づいた人が修正できる

Page 43: 安全なテーマ作成のためのPHPの知識

関数とエスケープの

話に戻ります

Page 44: 安全なテーマ作成のためのPHPの知識

エスケープの有無は関数による

全ての関数がエスケープするわけではない

エスケープするかどうかを確認するCodex を読む

ソースコードを読む

Page 45: 安全なテーマ作成のためのPHPの知識

esc_html は重ねても良い

二重エスケープしない

エスケープしているかどうか確信が無い場合、esc_html を通してから出力する

ただしパフォーマンスは低下する

Page 46: 安全なテーマ作成のためのPHPの知識

WordPress の関数も、

エスケープするかどうか

確認してから使う

Page 47: 安全なテーマ作成のためのPHPの知識

まとめ

ユーザーの入力はエスケープしてから出力する

属性値はダブルクォートで括る属性値に出力するときは esc_attr

関数によりエスケープの有無が異なる必ず確認してから使う

Page 48: 安全なテーマ作成のためのPHPの知識

もっと知りたい方に

発展編ユーザー入力で HTML タグを認めたい

JavaScript にデータを渡したい

徳丸本を読む