Web Security
网络安全
SQL インジェクション
- SQL 文の組み立ては全てプレースホルダで実装する。
- SQL 文の組み立てを文字列連結により行う場合は、エスケープ処理等を行うデータ
ベースエンジンの API を用いて、SQL 文のリテラルを正しく構成する。 - ウェブアプリケーションに渡されるパラメータに SQL 文を直接指定しない。
- エラーメッセージをそのままブラウザに表示しない。
- データベースアカウントに適切な権限を与える。
OS コマンド・インジェクション
- シェルを起動できる言語機能の利用を避ける
- シェルを起動できる言語機能を利用する場合は、その引数を構成する全ての変数に
対してチェックを行い、あらかじめ許可した処理のみを実行する。
パス名パラメータの未チェック/ディレクトリ・トラバーサル
- 外部からのパラメータでウェブサーバ内のファイル名を直接指定する実装を避ける。
- ファイルを開く際は、固定のディレクトリを指定し、かつファイル名にディレクトリ名が含
まれないようにする。 - ウェブサーバ内のファイルへのアクセス権限の設定を正しく管理する。
- ファイル名のチェックを行う。
セッション管理の不備
- セッション ID を推測が困難なものにする。
- セッション ID を URL パラメータに格納しない。
- HTTPS 通信で利用する Cookie には secure 属性を加える。
- ログイン成功後に、新しくセッションを開始する。
- ログイン成功後に、既存のセッション ID とは別に秘密情報を発行し、ページの遷移
ごとにその値を確認する。 - セッション ID を固定値にしない。
- セッション ID を Cookie にセットする場合、有効期限の設定に注意する。
クロスサイト・スクリプティング
HTML テキストの入力を許可しない場合の対策
- ウェブページに出力する全ての要素に対して、エスケープ処理を施す。
- URL を出力するときは、「http://」や 「https://」で始まる URL のみを許可する。
- 要素の内容を動的に生成しない。
- スタイルシートを任意のサイトから取り込めるようにしない。
- 入力値の内容チェックを行う
HTML テキストの入力を許可する場合の対策
- 入力された HTML テキストから構文解析木を作成し、スクリプトを含まない必要な要素のみを抽出する
全てのウェブアプリケーションに共通の対策
- HTTP レスポンスヘッダの Content-Type フィールドに文字コード(charset)を
指定する。 - Cookie 情報の漏えい対策として、発行する Cookie に HttpOnly 属性を加え、
TRACE メソッドを無効化する。 - クロスサイト・スクリプティングの潜在的な脆弱性対策として有効なブラウザの機能を有効にするレスポンスヘッダを返す。
- HTTP レスポンスヘッダの Content-Type フィールドに文字コード(charset)を
CSRF(クロスサイト・リクエスト・フォージェリ)
☞ 処理を実行するページを POST メソッドでアクセスするようにし、その「hidden パラメータ」に秘密情報が挿入されるよう、前のページを自動生成して、実行ページではその値が正しい場合のみ処理を実行する。
処理を実行する直前のページで再度パスワードの入力を求め、実行ページでは、再度入力されたパスワードが正しい場合のみ処理を実行する。
Referer が正しいリンク元かを確認し、正しい場合のみ処理を実行する。
重要な操作を行った際に、その旨を登録済みのメールアドレスに自動送信する。
HTTP ヘッダ・インジェクション
- ヘッダの出力を直接行わず、ウェブアプリケーションの実行環境や言語に用意されているヘッダ出力用 API を使用する。
- 改行コードを適切に処理するヘッダ出力用 API を利用できない場合は、改行を許可しないよう、開発者自身で適切な処理を実装する。
- 外部からの入力の全てについて、改行コードを削除する。