前回は、代表的なセキュリティ機能であるアカウント管理、認可、ログ出力についてまとめた。ここでは、文字集合と文字エンコーディングについて説明し、文字コードとセキュリティの関係についてまとめる。
1 文字コードとセキュリティの概要
Webアプリケーションで文字コードを指示する箇所は多い。例えば、ブラウザからHTTPリクエストの間やアプリケーションの処理などである。文字コードとは、文字集合と文字エンコーディング(文字符号化方式)の2つの概念を合わせたものと考えられる。以降に説明する。
2 文字集合
文字集合(character set)とは、文字を集めたものである。例えばアルファベットや数字などである。代表的な文字集合には以下のものがある。
- ASCII(American Standard Code for Information Interchange、US-ASCII):1963年に米国で制定された文字集合。7ビットの整数の範囲に、英語圏で使用頻度の高い数字、ローマ字(大文字・小文字)、記号類を収めている。ASCII以前の文字集合がベンダー独自に定めたものであるのに対して、ASCIIは初めて公的に規格化された文字集合である
- ISO-8859-1:ASCIIを8ビットに拡張する形で、英語以外のフランス語やドイツ語など西ヨーロッパ言語の表記に必要なアクセント記号つきのローマ字や記号類を追加したもの
- JISで規定された文字集合:JIS X 0101はASCIIを8ビットに拡張することにより、カタカナおよび日本語表記に必要な記号を追加した文字集合
- Microsoft標準キャラクタセット:JIS X 0201とJISX 0208に加えて、NECおよび日本IBMの拡張文字集合を統合したもの
- Unicode:世界共通の文字集合
- 異なる文字が同じコードに割り当てられる問題:セキュリティ上問題になりやすい文字として「\」と「¥」がある
- 文字集合の扱いが原因で起こる脆弱性:処理の順序によってはエスケープが抜けてしまうなど
3 文字エンコーディング
文字エンコーディングとは、 文字集合をコンピュータ上で扱うための符号化のこと。日本でWebアプリケーション開発に用いられることの多い文字エンコーディングには、JIS系文字集合を基にしたShift_JISやEUC-JP、Unicode文字集合を基にしたUTF-16やUTF-8がある。
- Shift_JIS:PCで漢字を扱うために、JIS X 0201の空き領域にJIS X 0208をマッピングする形で作られたもの。効率はいいが、文字マッチングの誤動作や不正なデータ列の悪用、そしてXSS脆弱性となることがある
- EUC-JP:Unix上で日本語データを使うために作られた文字エンコーディング。US-ASCIIの範囲はそのまま使い、JIS X 0208の日本語を扱う場合は、0xA1〜0xFEの領域を2バイト使って表現する
- ISO-2022-JP:7ビットの文字エンコーディングで、エスケープシーケンスという符号により文字集合(US-ASCIIとJIS X 0208)を切り替える方式。JISコードとも呼ばれる
- UTF-16:UCS-2と互換性を残しながらBMP外の文字をサポートする符号化方式として考案されたもの。サロゲートペア(代用対)という方法を使う
- UTF-8:Unicodeの文字エンコーディングの1つで、US-ASCIIと互換性のある符号化方式。非最短形式による脆弱性がある
4 文字コードによる脆弱性の発生要因
- 文字エンコーディングとして不正なバイト列による脆弱性:半端な先行バイトとUTF-8の非最短形式など
- 文字エンコーディングの扱いの不備による脆弱性:5C問題など
- 文字集合の変更に起因する脆弱性:¥記号の変更の際に\に変換されるなど
5 文字コードを正しく扱うために
- アプリケーション全体を通して文字集合を統一する:Unicodeで統一するなど。携帯電話向けブラウザや電子メールにおいては別処理
- 入力時に不正な文字エンコーディングをエラーにする
- 処理の中で文字エンコーディングを正しく扱う:マルチバイト文字に対応した処理系・関数のみを使う。関数の引数として文字エンコーディングを正しく指定する
- 出力時に文字エンコーディングを正しく指定する:HTTPレスポンスヘッダのContent-Typeで文字エンコーディングを正しく指定する。データベースの文字エンコーディングを正しく指定する。その他文字エンコーディングの指定が必要な箇所をもれなく指定する
- 文字エンコーディングの自動判定を避ける
最後に
対策としては、アプリケーション全体を通して文字集合をUnicodeで統一する、入力時に不正な文字エンコーディングをエラーにする、処理の中で文字エンコーディングを正しく扱う、出力時に文字エンコーディングを正しく指定することが重要である(より基礎的な内容については2進数によって広がるデジタルデータ表現の基礎知識5選を参照)。
アプリケーション開発で「文字化け」はよくあることだが、これが発生するということは文字コードの適切な設定や処理がなされていないことを意味する。まずは文字化けをなくすために、不正な文字エンコーディングではエラーになるか代替文字(U+FFFD)に変換されること、「表」や「ソ」、「能¥」などが正しく登録・表示されること、尾骶骨テストをクリアすること、の確認をするべきである。
次回は、携帯電話向けWebアプリケーションの脆弱性対策についてまとめる。
![]() |