茨城県つくばみらい市から来ました

プログラマーになるために生きています

安全な PHP アプリケーションの作り方2013

  • PHP のライフサイクル
    • 最近 WindowsXP のサポート終了が話題
      • 9年間だった
    • サポートラフサイクルポリシー
      • メインストリーム最低2年
      • 延長サポート最低5年
      • 最新版を使う限り、最低7年のサポートが保証されている
    • PHP のサポート状況
    • わりと短い
    • PHP4,5
      • 運が悪いと3年半くらいしかない
    • RFC Release Procs
    • Yearly release cycle
      • 3 year release
      • 2 years bug fix only
      • 1 year security fixes only
    • まとめ
      • ソフトウェア選定時にサポートライフサイクルポリシーを確認すること
      • サポート計画を検討する
        • PHPディストリビューションの公式パッケージのもので利用する
        • PHPのバージョンアップにとことん付き合う
        • 途中でバージョンアップする計画を立てておく
      • 他のソフトウエアもサポートライフサイクルに注意
  • セッションフィクセーションに対応するする
    • PHP 5.5.2 で Strict Sessions がマージされました(大垣さん作
    • strict sessions とはなにか
      • PHPセッション管理機構には、未初期化のセッション
    • (デモ)
    • PHP 5.5.4RC1
    • sessionを消しても session_id が変わらない←!!!!!!!!!!
    • session_strict = 1 にすると勝手なSESSIONIDを許さなくなる
    • ログイン成功後に下記を実行すること
      • session_regenerate_id(true) を実行する
    • PHP 5.5.2 以降では php.ini に以下を指定すると、Session Adoption を防げる
  • パスワードの守り方
    • Linked In で(SHA1ハッシュ化後の)パスワードが漏洩
      • Linked In 650万件のパスワードハッシュのうち540万件が一週間で解読された
    • Salt ってなに?
      • ソルトとは、ハッシュの元データに追加する文字列
      • 見かけのパスワードの長さを長くする→レインボーテーブル対策
      • ユーザー毎にソルトを変えることで、パスワードが同じでも、異なるハッシュ値が得られる
      • Linked In なら 650万倍のコンピューティングリソースが必要になったはず(一週間で540万件は解読されなかったはず)
    • Stretchingってなに?
      • ストレッチングとは、ハッシュの計算を繰り返すこと
      • ハッシュの計算を遅くすることにより、辞書攻撃や総当り攻撃に対抗する
    • password_hash 関数(PHP 5.5)
      • 照合のときは password_verify 関数がある
    • PHP 5.4 まではすごい面倒
  • デモから学ぶHTML5セキュリティ入門
    • DOM based XSS
    • JSON Hijack
      • 罠サイトから script 要素で json を読み込む
        • script 要素はクロスドメインで読み込み可能
      • JSON Hijack の罠
        • setter版
        • IEの場合は vbscriptJSONを読み込む
          • x-content-options: nosniff
          • x-requested-with: でどこから呼ばれたかを判断する
            • script 要素から呼ばれた場合はつかない
    • JSON による XSS
      • XHRでJSONを読み込んで表示しているプログラム
        • content-type text/html
          • まずいことが
          • エスケープ漏れでブラウザで開いた場合にjsが実行可能
      • 対策
        • content-type を正しく出力
        • x-content-type-options: nosniff を出力
        • リクエスト時に x-requested-with
    • XHR L2 による CSRF
      • post の request/response が json
      • トークンが無い←!
      • json_decode
      • 高橋くんの見解
        • form の post 送信ではJSON形式はPOSTNATAL出来ない
        • XHRではクロスドメインでポスト出来ない
      • request.withCredentials = true
      • クロスオリジンになるのでブラウザ上でレスポンスが表示されることはないが、リクエスト自体はサーバー上に到達するのでパスワードが変更されちゃう!
      • けっこう誤解している人が多いので注意
      • content-type text/plain は例外らしい
      • 対策
        • 普通にトークン使え
    • 広告モジュールからpostmessageでsiteidを受け取る
      • 対策
        • postmessage の時にオリジンを指定する
    • おさらい
      • 広告表示モジュールにXSS
      • 広告モジュールから販売サイトへの postMessage
      • 販売サイトのDOM based XSS
    • ローカルストレージに攻撃文字列を埋め込める
  • まとめ
    • XSSはエスケープをしっかり
    • CSRF対策はトークン忘れない