第一回 社内勉強会 Security Checklist に学ぶ PHP  セキュリティ Yuya Takeyama  2010/05/21 (Fri)
本日の目的 <ul><li>Webにおけるセキュリティの基本を再確認 「知ってて当然」とされる事柄はあまりに多い。 共通の語彙を身につければ、コミュニケーションコストも下がる。
PHP におけるセキュリティの難所を知る PHP に特化した、より実践的な話。 教材として PHP Application Security Checklist を使用。
自社サービスにおける問題点の共有
このあと、そのための時間をとる予定。
この機会にぶっちゃけましょう。 </li></ul>
アジェンダ <ul><li>Web におけるセキュリティのおさらい ・クロスサイトスクリプティング
・ SQL インジェクション
PHP のセキュリティ
・本当はおそろしい php.ini ・ 5c 問題の無間地獄 </li></ul>
Cross Site Scripting Cross Site Scripting Cross Site Scripting Cross Site Scripting
略して
CSS
・・・だと Cascading Style Sheet と混同するので
XSS 一般的には と呼ばれています (DVD のプロテクト技術にも CSS ってのがありましたが・・・ )
簡単に 言うと
サイトを越えて 悪意のあるコードを 実行すること
Input from $_GET, $_POST, $_COOKIE and $_REQUEST is considered tainted.
直訳
$_GET 、 $_POST 、 $_COOKIE 、そして  $_REQUEST  からの入力は 汚染 を考慮されているか。
Understood that only some values in $_SERVER and $_ENV are untainted.
直訳
汚染 されていないのは  $_SERVER  と  $_ENV  のいくつかの値だけであることを理解しているか。
つまり
入力の 汚染 を 常に 疑うこと
出力は 常に エスケープ すること
SQL Injection
例
MySQL による ユーザー認証
SELECT * FROM users WHERE user = ' yuya ' AND pass = ' doom ' 色 がついているのは、ユーザーのフォームへの入力による値
パスワードが一致しないと レコードが引けない (= ログインできない ) はずだけど・・・
SELECT * FROM users WHERE user = ' yuya' OR 1 # ' AND pass = ' doom '
もっと酷い ケース
SELECT * FROM users WHERE user = ' ';TRUNCATE users # ' AND pass = ' doom '
ただし
PHP の mysql_query  関数は ;( セミコロン ) 区切りによる 複数のクエリ の同時送信は できない 。
さておき
どうしたら SQL インジェクションから 自由になれるか
入力の 汚染 を 常に 疑うこと
出力は 常に エスケープ すること
SELECT * FROM users WHERE user = ' yuya  ' OR 1 # ' AND pass = ' doom ' SQL 文のエスケープをしてあげる ※ SQL 文は PHP アプリケーションから 見れば出力ですね
Web におけるセキュリティのまとめ <ul><li>入力の汚染を常に疑う
出力を常にエスケープする
これを守るだけで、その他の脅威
 ・ディレクトリトラバーサル
 ・クロスサイトリクエストフォージェリ  (CSRF)
 ・コマンドラインジェクション等
も防ぐことができます。 </li></ul>
本当は おそろしい php.ini
ここで再び PHP Application Security Checklist
register_globals is disabled.
直訳
register_globals は 無効化されているか
http://example.net/?debug=on にアクセスすると ” on” という値を持った 変数 $debug が 勝手に できてしまう
現在は デフォルトで Off になっているので とりあえず 安心
php.ini には こういう 地雷 がいっぱい しかも On だったりするから困る
addslashes() は マルチバイトを 扱えないから 使用禁止!
magic_quotes_gpc も On にするの禁止!
addslashes() is not used.
Magic quotes is disabled.
PHP Application Security Checklist さんも そう言ってるので!
magic_quotes_gpc の問題点 <ul><li>エスケープされたもの、されてないものが混在するため、余計煩雑。ありがた迷惑。
そもそも addslashes() がイケてない ( 日本になんて生まれるんじゃなかった )
マルチバイト文字を抜きにしても、 addslashes() ではエスケープできない DB もある。 (SQLite とか )
PHP6 では削除予定 </li></ul>
5c 問題の 無間地獄
addslashes() じゃない SQL のエスケープについて 考えてみる
mysql_real_escape_string()
これで 安心?
否
Upcoming SlideShare
Loading in …5
×

第一回 社内勉強会 PHP Application Security Checklist に学ぶ PHP セキュリティ (Excerpt)

2,572 views

Published on

Web アプリケーションにおけるセキュリティの基本、また PHP 特有の問題等について。

  • Be the first to comment

第一回 社内勉強会 PHP Application Security Checklist に学ぶ PHP セキュリティ (Excerpt)

  1. 1. 第一回 社内勉強会 Security Checklist に学ぶ PHP セキュリティ Yuya Takeyama 2010/05/21 (Fri)
  2. 2. 本日の目的 <ul><li>Webにおけるセキュリティの基本を再確認 「知ってて当然」とされる事柄はあまりに多い。 共通の語彙を身につければ、コミュニケーションコストも下がる。
  3. 3. PHP におけるセキュリティの難所を知る PHP に特化した、より実践的な話。 教材として PHP Application Security Checklist を使用。
  4. 4. 自社サービスにおける問題点の共有
  5. 5. このあと、そのための時間をとる予定。
  6. 6. この機会にぶっちゃけましょう。 </li></ul>
  7. 7. アジェンダ <ul><li>Web におけるセキュリティのおさらい ・クロスサイトスクリプティング
  8. 8. ・ SQL インジェクション
  9. 9. PHP のセキュリティ
  10. 10. ・本当はおそろしい php.ini ・ 5c 問題の無間地獄 </li></ul>
  11. 11. Cross Site Scripting Cross Site Scripting Cross Site Scripting Cross Site Scripting
  12. 12. 略して
  13. 13. CSS
  14. 14. ・・・だと Cascading Style Sheet と混同するので
  15. 15. XSS 一般的には と呼ばれています (DVD のプロテクト技術にも CSS ってのがありましたが・・・ )
  16. 16. 簡単に 言うと
  17. 17. サイトを越えて 悪意のあるコードを 実行すること
  18. 18. Input from $_GET, $_POST, $_COOKIE and $_REQUEST is considered tainted.
  19. 19. 直訳
  20. 20. $_GET 、 $_POST 、 $_COOKIE 、そして $_REQUEST からの入力は 汚染 を考慮されているか。
  21. 21. Understood that only some values in $_SERVER and $_ENV are untainted.
  22. 22. 直訳
  23. 23. 汚染 されていないのは $_SERVER と $_ENV のいくつかの値だけであることを理解しているか。
  24. 24. つまり
  25. 25. 入力の 汚染 を 常に 疑うこと
  26. 26. 出力は 常に エスケープ すること
  27. 27. SQL Injection
  28. 28.
  29. 29. MySQL による ユーザー認証
  30. 30. SELECT * FROM users WHERE user = ' yuya ' AND pass = ' doom ' 色 がついているのは、ユーザーのフォームへの入力による値
  31. 31. パスワードが一致しないと レコードが引けない (= ログインできない ) はずだけど・・・
  32. 32. SELECT * FROM users WHERE user = ' yuya' OR 1 # ' AND pass = ' doom '
  33. 33. もっと酷い ケース
  34. 34. SELECT * FROM users WHERE user = ' ';TRUNCATE users # ' AND pass = ' doom '
  35. 35. ただし
  36. 36. PHP の mysql_query 関数は ;( セミコロン ) 区切りによる 複数のクエリ の同時送信は できない 。
  37. 37. さておき
  38. 38. どうしたら SQL インジェクションから 自由になれるか
  39. 39. 入力の 汚染 を 常に 疑うこと
  40. 40. 出力は 常に エスケープ すること
  41. 41. SELECT * FROM users WHERE user = ' yuya ' OR 1 # ' AND pass = ' doom ' SQL 文のエスケープをしてあげる ※ SQL 文は PHP アプリケーションから 見れば出力ですね
  42. 42. Web におけるセキュリティのまとめ <ul><li>入力の汚染を常に疑う
  43. 43. 出力を常にエスケープする
  44. 44. これを守るだけで、その他の脅威
  45. 45.  ・ディレクトリトラバーサル
  46. 46.  ・クロスサイトリクエストフォージェリ (CSRF)
  47. 47.  ・コマンドラインジェクション等
  48. 48. も防ぐことができます。 </li></ul>
  49. 49. 本当は おそろしい php.ini
  50. 50. ここで再び PHP Application Security Checklist
  51. 51. register_globals is disabled.
  52. 52. 直訳
  53. 53. register_globals は 無効化されているか
  54. 54. http://example.net/?debug=on にアクセスすると ” on” という値を持った 変数 $debug が 勝手に できてしまう
  55. 55. 現在は デフォルトで Off になっているので とりあえず 安心
  56. 56. php.ini には こういう 地雷 がいっぱい しかも On だったりするから困る
  57. 57. addslashes() は マルチバイトを 扱えないから 使用禁止!
  58. 58. magic_quotes_gpc も On にするの禁止!
  59. 59. addslashes() is not used.
  60. 60. Magic quotes is disabled.
  61. 61. PHP Application Security Checklist さんも そう言ってるので!
  62. 62. magic_quotes_gpc の問題点 <ul><li>エスケープされたもの、されてないものが混在するため、余計煩雑。ありがた迷惑。
  63. 63. そもそも addslashes() がイケてない ( 日本になんて生まれるんじゃなかった )
  64. 64. マルチバイト文字を抜きにしても、 addslashes() ではエスケープできない DB もある。 (SQLite とか )
  65. 65. PHP6 では削除予定 </li></ul>
  66. 66. 5c 問題の 無間地獄
  67. 67. addslashes() じゃない SQL のエスケープについて 考えてみる
  68. 68. mysql_real_escape_string()
  69. 69. これで 安心?
  70. 70.
  71. 71. mysql_client_encoding() すると latin1 とか・・・
  72. 72. SET NAMES すればいいのでは?
  73. 73.
  74. 74. SET NAMES しても mysql_client_encoding() は変わりません。
  75. 75. mysql_set_charset() しましょう とりあえずこれで うまくいく模様 ( 要検証 )
  76. 76. ただし
  77. 77. mysql_set_charset() は PHP 5.23 以降のみ あとは my.cnf とか 触らないといけなくなる・・・
  78. 78. プリペアド ステートンメント
  79. 79. $sql = &quot;INSERT INTO artists (id, name) VALUES ( ? , ? )&quot;; $stmt = $db->prepare($sql); $data = array( 1 , ' 野坂昭如 '); $db->execute($stmt, $data); ↑ こーいうの
  80. 80. これで 安心?
  81. 81.
  82. 82. PHP スクリプトで エミュレート しているだけだと、 結局同じことが 起りうる
  83. 83. とりあえず Pear は ダメっぽい
  84. 84. DBMS 側が 提供している API を利用する ライブラリなら 安心?
  85. 85. PHP における Shitft_JIS の扱いの難しさ <ul><li>magic_quotes_gpc, addslashes() は禁止
  86. 86. SET NAMES も禁止。 mysql_set_charset() しましょう
  87. 87. プリペアドステートメントは、実装次第 有名ライブラリでも疑り深くテスト
  88. 88. mbstring.internal_encoding は UTF-8 にするのが無難 </li></ul>
  89. 89. 参考文献 『 PHP Application Security Checklist 』 http://www.sk89q.com/content/2010/04/phpsec_cheatsheet.pdf Chris Shiflett 『入門 PHP セキュリティ』

×