メモ2: 徳丸本に載っていないWebアプリケーションセキュリティ (PHPカンファレンス北海道)

- OSコマンドインジェクションは本当にめずらしい
    - 釣りでいうとイトウ(本人談)
- キャッシュからの情報漏洩
    - リバースプロキシ、フォワードプロキシ、ブラウザのキャッシュ機能
    - アプリケーションの負荷軽減
    - 「別人問題」
        - 原因のひとつがキャッシュ
        - Squidのキャッシュ
            - override-lastmod
            - OpenPNE
            - サトーさん
                - /diary/2 自分の日記
                    - 自分の日記が見れなくなる場合も
            - タナカさん
                - /diary/1 自分の日記
        - ブラウザのキャッシュ
            - はてなブックマーク(プライベート)
            - ログイン→ログアウト
                - /ockegthm2 見えた
                    - ブラウザのキャッシュが残っていたから
                    - ブラウザを再起動しても見えた
            - ブラウザを共有することなんてない
                - 許容してもいいかも
        - 対策
            - セキュアプログラミング講座より
            - Cache-Control: no-store
            - BK
                - HTTP/1.0
                    - Pragma: no-cache
                - クエリにランダムな数字
                    - ANAのサイト
                        - /fs/domjpmenu?rand=20120421131830
                        - 見守ってあげて
- クリックジャッキング
    - iframeの上で「透明に」表示
    - demo
        - twitter
        - 「僕本当はPHP嫌いなんだ #phpcondo」
            - 画像を重ねる
                - 後ろのボタンを押してしまう
        - Firefox 3
            - …
    - x-frame-options: deny 禁止して良い場合
    - x-frame-options: sameorigin
    - CSRFとの関係
        - トークン埋め込み
            - ついでにx-frame-optionsヘッダ出力
- Ajaxセキュリティ入門
    - 入門書の問題
        - '<p>' + json[i].caption + '</p>'
        - データにJavaScriptを入れてみる
            - XSS
    - 原因と対策
        - HTMLエスケープ
- evalインジェクション
    - jQueryは安全にやってくれる
    - $.get ($.getJSONではない)
        - eval(text)
        - データにJavaScriptを入れてみる
            - ""+alert("1")+""
                - XSS
    - 対策
        - 自前でJSON生成するな!
        - evalでJSON解釈するな!
- json.phpを直接ブラウズ
    - "キャプション1<body onload=alert(1)>"
    - Content-Type: application/json
        - IEだけ
        - IE9
            - URLに/a.htmlをつけると…
            - HTMLとして解釈されてしまう
        - X-Content-Type-Options: nosniff つけないのは死ね!
            - IE7だとだめ
    - 対策
        - nosniff
        - application/json; charset=utf8
        - IE7
            - <, >もエスケープ
                - \u003Cでエスケープされる
                - HTMLとして解釈されているけど、JavaScriptとしては実行されない
- JSONハイジャック
    - 別ドメインのJSONを罠サイトからscript要素で読み出す
    - 正規のCookieが送信される→JSONが取得できる
    - ソース上に置いてあるだけなので大丈夫
        - Object.prototype.__defineSetter__
        - 読めてしまう!
    - Firefox 11.0だと問題なし
        - Androidの標準ブラウザでハイジャック成功
    - 対策
        - script要素からのリクエストにはレスポンスを変えさない
        - x-requested-with: xmlhttprequest
            - POST? 好まない
            - for(;;)を置く? 好まない
- ドリランド増殖祭
    - demo(こうだったかも)
        - 鳥ランド カード交換
        - select, insert, 番号振りなおす, 元カードをdelete
            - 同時にやる
                - 増えた!
    - 対策
        - トランザクション
        - ロック
            - SELECT .. FOR UPDATE
        - 同時にやってみる
            - 片方はSELECTしたけど読めずに終わる
        - トランザクションは学ぶの難しいよね
            - NoSQL, Memcached, DBのパーティショニングやシャーディング
            - レプリケーション, LDAPやファイルなどのトランザクション未対応のもの