Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
1 of 48

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

8

Share

Download to read offline

WordCamp Kobe2013 の発表スライド。

WordPress は PHP でカスタマイズするため、自由度が高く、汎用性も高い。
一方で、カスタマイズする人がセキュリティに気を配る必要がある。

本発表では、テーマカスタマイズで起こりがちなクロスサイトスクリプティング(XSS、またはスクリプトインジェクションとも呼ぶ)を取り上げる。

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

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

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

×