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.

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

4,077 views

Published on

WordCamp Kobe2013 の発表スライド。

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

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

Published in: Technology
  • Be the first to comment

安全なテーマ作成のための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. 検索時の URLhttp://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_htmlesc_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 にデータを渡したい徳丸本を読む

×