20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    Favorites, Groups & Events

    20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」 - Presentation Transcript

    1. 「 PHP による web アプリケーションの セキュリティ入門」 第5回社内勉強会
    2. 攻撃を防ぐには
      • 攻撃の種類を知る
      • 防御の方法を知る
              • なにより
      • 攻撃されている、 ということを知る
    3. 本日のお題
      • PHP による web アプリケーションの セキュリティ入門
    4. 本日の目標
      • 業務でおなじみ PHP を例に
      • PHP に限ったことじゃない
      • 基礎知識と危機感を 持って帰ってください
    5. 本日ご紹介しますのは
      • XSS
      • CSRF
      • SQL インジェクション
    6. クロスサイトスクリプティング
      • 略称: XSS
      • 入力データを無防備に HTML 出力  ↓
      • ブラウザがタグとして解釈  ↓
      • 当然 <script> タグも有効  ↓
      • 閲覧したクライアント上で 任意の JavaScript コードを実行させることができる
    7. やってみよう
      • デモ
    8. クロスサイトスクリプティング
      • JavaScript を実行されるとこんなに危険
      • クッキーの値を設定・取得できる
        • セッションハイジャック
      • 意図しないページ遷移を起こさせる
        • クロスサイト・リクエスト・フォージェリ ( 後述 )
      • ページ全体を置き換える
        • フィッシング
      • フォームのアクションを書き換える
        • フォーム情報の不正取得
    9. 対策
      • 表示するときは文字列をエスケープする
      • htmlspecialchars($value, ENT_QUOTES) ;
      • http://jp.php.net/htmlspecialchars
      '&' ( アンパサンド ) は '&amp;' になります。 ENT_NOQUOTES が設定されていない場合、 '&quot;' ( ダブルクォート ) は '&quot;' になります。 ENT_QUOTES が設定されている場合のみ、 ''' ( シングルクオート ) は '&#039;' になります。 '<' ( 小なり ) は '&lt;' になります。 '>' ( 大なり ) は '&gt;' になります。
    10. 不十分な場合もある・1
      • タグの属性に出力する場合
      <a href=&quot;{$url}&quot;>LINK</a> $url = htmlspecialchars( &quot;javascript:alert(document.cookie)&quot;, ENT_QUOTES) ;
      • 安全な URL であるかチェックする必要がある
      • IE のバグ: java script:alert()
    11. 不十分な場合もある・2
      • そもそも設計を見直すべき場合
      <script> {$hoge} </script> <style> {$piyo} </style>
      • それは本当に必要か?
    12. 入力に HTML タグを許可したい場合
      • 結構大変
      • 例:はてなダイアリーの場合
          • ホワイトリストで制限する
          • 独自タグを実装する
          • あきらめる
    13. まとめ
      • クライアントから送られてくる値は信用しない
        • $_GET, $_POST
        • $_REQUEST は使わないようにしよう
      • エスケープは表示する直前に行う
        • 元データを加工してしまうと転用しづらい
      • 私たちはケータイだから関係ないや
        • … と思わずしっかり対策する
    14. クロスサイト・リクエスト・フォージェリ
      • 略称:CSRF / XSRF
          • 「しーさーふ」ってダサいよね
      • 攻撃者が攻撃用のページを用意  ↓
      • 利用者がアクセスすること  ↓
      • 攻撃リクエストが送信される
    15. やってみよう
      • デモ
    16. クロスサイト・リクエスト・フォージェリ
      • 恐ろしいところ: 正規のリクエストと見分けがつかない
      • 対策が大変
        • パスワードを再入力させる
        • CAPTCHA を使う
        • トークンを使う
    17. トークン?CAPTCHA?
      • トークンって?
        • ユーザごとに固有の値
        • 登録時に一度だけ生成する使い捨ての値
          •  ワンタイムトークン
      • CAPTCHA
        • こんなの
    18. トークンによる対策の概要
      • フォームでトークン生成  ↓
      • hiddenフィールドから一緒に送信
      • サーバ側でセッションに格納  ↓
      • リクエストとセッションを突き合わせる  ↓
      • 合致したら正当なリクエストとして扱う
    19. 私たちは携帯向けサイトを作っている
      • cookieが使えない
        • セッションIDをURLで引き回すのも前時代的
      • webサーバが複数ある
        • PHP標準のセッション機能が使えない
      • 油断しがち
        • 「ソースが見えない」 「パラメータは改竄できない」は 幻想
    20. 対策いろいろ
      • 端末識別 ID による認証
        • ケータイサイトでは基本
          • 賛否両論ありますが…
      • クリティカルな箇所はトークン
        • チートページを作って自分自身のアカウントを攻撃  ↓
        • 自分のパラメータを書きかえられちゃうとマズー
        • DB 、 memcached などを使っていろいろ実装する必要がある
      • 入力値のチェック
        • クライアントから送られてくる値は信用しない
        • $_GET, $_POST
        • $_REQUEST は使わないようにしよう
          • 大事なことなので二回言いました
    21. まとめ
      • いろいろ大変
      • 手を抜くと被害が大きい
      • 大変だが油断しないこと
        • 人には言えない痛い目に遭ってます
    22. SQLインジェクション
      • アプリケーションが想定しない SQL文を実行させること
      • デモスクリプトで削除に使ってるクエリ
      $sql = &quot;DELETE FROM bbs&quot; . &quot; WHERE id = { $_POST['id'] }&quot; . &quot; AND pass = '{$_POST['pass']}' &quot; . &quot; LIMIT 1&quot; ;
      • 見るからに危険
    23. こんな攻撃ページを作った <form action=&quot;http://localhost/Part2/2-1.php&quot; method=&quot;POST&quot;> sql:<input type=&quot;text&quot; name=&quot;id“ value=&quot; 0 OR 1 # “ readonly=&quot;true&quot; /><br /> <input type=&quot;submit&quot; name=&quot;delete“ value=&quot;Do It!&quot; /> </form>
    24. やってみよう
      • デモ
    25. SQLにパラメータを埋め込む
      • 展開すると MySQLは[#]から行末までと [/* ~ */]がコメント
      • ということは…
      DELETE FROM bbs WHERE id = 0 OR 1 # AND pass = '' LIMIT 1
    26. 対策
      • プリペアドステートメントとバインド使え。 以上。
      • PHP 5.2以上は PDOで…
      $sql = &quot;DELETE FROM bbs&quot; . &quot; WHERE id = :id&quot; . &quot; AND pass = :pass &quot; . &quot; LIMIT 1&quot; ; $pdo = new PDO($connection_param) ; $stmt = $pdo->prepare($sql) ; $stmt->bindParam(&quot;:id&quot;, $_POST['id'] , PDO::PARAM_INT) ; $stmt->bindParam(&quot;:pass&quot;, $_POST['pass'], PDO::PARAM_STR) ; $stmt->query() ;
    27. 使えない場合は?(数値型)
      • 数値型は数値としての妥当性をチェックする
        • intval()
        • is_int()
        • is_numeric()
        • preg_match(&quot;/^[0-9]+$/&quot;, $param)
      • それぞれ挙動が違うので 適切なものを利用する
    28. 使えない場合は?(文字列型・1)
      • データベース接続モジュールが提供する エスケープ関数を利用する
        • string mysql_escape_string( string $unescaped_string)
        • string pg_escape_string( [resource $connection], string $data)
    29. 使えない場合は?(文字列型・2)
      • 自力でエスケープ
      • PostgreSQL は 8.1.4 から 設定で「 ‘ 」を拒否できるようになった
        • 「 '' 」を使うのが望ましい 1
      \ ‘’ or ’ ‘ MySQL PostgreSQL ‘’ ‘ Oracle MS SQL DB2 エスケープ 元の文字 DB
    30. 全体のまとめ
      • 一番よくある攻撃3種類を簡単に紹介
      • 攻撃されることを前提にした 設計・コーディングを
        • リクエストパラメータは絶対に信用しない
        • 攻撃者は執念深い
        • 「ケータイだから」と油断は禁物
      • 攻撃方法はこれだけじゃない
        • 常に情報を収集する努力を
    31. 必読
      • PHPサイバーテロの技法 ―攻撃と防御の実際
        • 社内蔵書にあるので必読
        • この本だけで十分とは 言い切れないのが恐ろしい
    32. リンク集
      • クロスサイトスクリプティング - Wikipedia
            • http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0
      • クロスサイトリクエストフォージェリ - Wikipedia
            • http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%AA
      • SQL インジェクション - Wikipedia
            • http://ja.wikipedia.org/wiki/SQL%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3
      • 開発者のための正しい CSRF 対策
            • http://www.jumperz.net/texts/csrf.htm
      • はてなダイアリー XSS 対策 - はてなダイアリーのヘルプ
            • http://hatenadiary.g.hatena.ne.jp/keyword/%e3%81%af%e3%81%a6%e3%81%aa%e3%83%80%e3%82%a4%e3%82%a2%e3%83%aa%e3%83%bcXSS%e5%af%be%e7%ad%96
      • 徳丸浩の日記 – そろそろ SQL エスケープに関して一言いっとくか – SQL のエスケープ再考
            • http://www.tokumaru.org/d/20080601.html#p01
      • Amazon.co.jp : PHP サイバーテロの技法―攻撃と防御の実際
            • http://www.amazon.co.jp/gp/product/4883374718/ref=sib_rdr_dp
    33. おしまい
      • ご清聴ありがとうございました

    + kwappakwappa, 10 months ago

    custom

    1178 views, 0 favs, 1 embeds more stats

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 1178
      • 1078 on SlideShare
      • 100 from embeds
    • Comments 0
    • Favorites 0
    • Downloads 3
    Most viewed embeds
    • 100 views on http://kwappa.txt-nifty.com

    more

    All embeds
    • 100 views on http://kwappa.txt-nifty.com

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?