セキュリティレベルの高いサイトを構築する 22 カ条
最近、何処の会社でもセキュリティに関してうるさく言われているかと思います。自分としても今まで気を遣ってきていたつもりではあります。しかしながら、
を読んでみて、お恥ずかしい限りですが勘違いしていた部分もありました。実際、Amazon とか Yahoo! のログイン画面を見ても、デフォルトが http によるアクセスになっていたりして、メジャーどころでも最新の注意が払われている訳ではないのだなぁ〜と思ったり・・・。本当は全ページ SSL が理想とは知りつつも、SSL の処理負荷の高さ故に、ついついケチったページ遷移にしまうからなのでしょう。。。自分含めて。
自分への情報もかねて、上記ページに記載されている、31箇条の鉄則と最近の事情を加味して、セキュリティレベルの高いサイトを構築する 22 カ条としてまとめてみました。
- ブラウザのセキュリティレベル設定でデフォルトの「中」でも動くように設計すること
- 認証は本人しか知り得ない情報を必ず使うこと
※ひょっとして、ID のみで認証しているページはありませんか?
- 認証エラーのエラー内容詳細は画面に出力しないこと
※メールアドレスの存在有無を知らせたりしてませんか?
- 認証DBは公開ディレクトリに設置しないこと(当たり前)
- 認証後にのみ閲覧可能なページは全てのアクセスを認証チェックすること
※ログイン時にのみ認証したり、認証は CGI ページのみで画像等は静的に閲覧可能とかしてませんか?
- パスワードリマインダは本人しか知り得ない情報を複数使うこと
※本人だけでなく、他人も簡単に類推できちゃってませんか?
- 認証はランダム性のある類推できないセッション ID ベースで管理すること
※URL や PostData に ID/PW 等の秘密情報を埋め込んでませんか?
- セッションの状態は可能なかぎり全てサーバ側に持たせること
※URL や PostData に 無くてもいい秘密情報を埋め込んでませんか?
- POST で受け取るべきリクエストなら GET は排除すること
- ログイン前にセッション ID を生成しない、もしくはログイン後のセッション ID は変更すること
- セッションに有効期限をもたせること
- 有効期限がきれたりログアウトした無効なセッション情報はサーバ上から削除すること
- XSS 脆弱性を排除すべくサニタイズ処理をいれること
- SQL インジェクションを排除すべくプレースホルダを使って SQL を記述すること
- ログイン画面から SSL を使うこと
※ログイン画面が http で GET/POST 先が https の場合、ログイン画面アクセス時に通信内容を改ざんしてリンク先が書き換える事が可能。知らない間に、ID/PW を盗聴するフィッシングサイトに誘導されているかも?
- カード情報等の秘密度が高いものは、SSL 経由であれ全ての情報は表示しないこと
- Ajax を実装する際に秘密情報や脆弱性になりうる情報を http で送信しないこと
- JavaScript 等で見られたくないファイルは可能であるならば、httpd レベルで Referrer 等で不用なアクセスを制限すること
- リクエスト内にテンプレートファイル名やダウンロードファイル名を直接埋めこまないこと
※../../../etc/password とかパスを遡ってシステム情報が閲覧できる状態になってませんか?
- オレオレ証明書(自己発行証明書)を使わないこと
- オレオレ証明局(自己運営証明局)を使わないこと
- 暗号化情報を Cookie 等で使う場合、十分な強度の暗号化を使うこと
意外と、https の使い方や、セッション管理がちゃんとできていない場合が多いのではないでしょうか。
暗号強度あたりも微妙ですね。数年前までは安全圏だったものも、数年度には危ないわけですが、昔の暗号方式のまま放置されている場合も多いのでは?オレオレ暗号化なんかもあったりして・・・。
セキュリティー、奥が深いですね。その他、気が付いたことがあれば、随時項目追加しよっと(既に 19 -> 22 に増やしたり・・・)。
日経BP社 (2004/11)
Webアプリケーションのセキュリティを考える上での良書
コメントやシェアをお願いします!
ゆーた
勉強になりました。
WEB制作を勉強始めたとこで
先生に聞いてもまともな答えが返ってこなかったので
参考にします
てすと
個人用でないサイトには、CSRF脆弱性も気を使っておいた方がいいと思います。
CSRFとは?
http://d.hatena.ne.jp/keyword/CSRF
何気に、この脆弱性を利用して便利ツール作ってみました。
もちろん悪意のないものですが。