The Document of Aska

Webアプリケーション作った後のチェック表

チェックリスト

  • XSS対策
    • Text::Xslate等、自動エスケープに対応したテンプレートエンジンを利用している
    • <script>要素の中に動的な埋込みをしていない 補足1
    • プログラム中でHTML生成を行う場合、要素の属性値のセット時にエスケープしている 補足2
  • CSRF対策
    • 更新系処理の際、パラメーターのセッションID等でユーザの意図した操作で来たリクエストである事を検証している
  • Session Fixation対策
    • ログイン処理の際必ずセッションIDを再発行している
    • ※ Catalyst::Plugin::Session の $c->change_session_id 参照
  • OSコマンドインジェクション対策
    • system / exec 等システム関数を利用する場合、引数は配列で渡している 補足3
    • 出力結果が欲しい外部コマンド呼び差しには3引数のopenを使用している 補足4
  • SQLインジェクション対策
    • SQL文にユーザの入力値を含めていない 補足5
  • 乱数予測対策
    • パスワードの自動生成等、乱数生成にrandを使用していない、String::Urandomを使用している。
  • ディレクトリトラバーサル対策
    • ユーザの入力文字列からファイルパスを求めるような場合、../等で上位ディレクトリを参照されないように入力チェックの上、basenameを介している
  • セッションハイジャック対策
    • セッションIDの生成はモジュールに任せている
    • HTTPS利用時、Cookieにsecureフラグを付与している( LB等配下の場合等注意 )
    • ログアウト時、明示的にセッションを破棄している
    • セッションIDはCookieに格納し、URLで引き継がない(refererに残る)
    • 携帯用サイトでやむを得ずURLにセッションIDを含める場合、他サイトへのリンクはリダイレクト用URLを踏ませている
    • 上記のリダイレクト処理で、URLに改行等を含まれると任意のヘッダーを挿入される為、ヘッダーはモジュールで生成している
  • HTTPヘッダインジェクション対策
    • Locationヘッダー等特定ヘッダーを出力する際、ヘッダーの生成はモジュールに任せている
    • print "Location: ", $q->param('url'), "¥n"; だとSet-Cookie等埋め込む余地が生まれる
  • 強制ブラウズ対策
    • アクセス制限が必要なリソースに対してアクセス制限を行っている
    • デバッグ用ページをバレないだろうと安易に置いておかない、アクセス制限を行う
    • どんなURLで何が公開されているのかディレクトリレベルで構わないので構成図を起こしてチェックしている
  • パスワード攻撃対策
    • アカウントロック機能を備えている
  • 情報漏洩対策
    • パスワードはソルト付きでハッシュ化して保存している

ツール

  • Live Http Headers (Add-ons for Firefox)
  • WATProxy
  • Burp Proxy
  • Proxomitron Version Naoko
  • Nikto Version 2.1.0