character-code

文字集合と文字エンコーディング 文字コードとセキュリティの関係

前回は、代表的なセキュリティ機能であるアカウント管理、認可、ログ出力についてまとめた。ここでは、文字集合と文字エンコーディングについて説明し、文字コードとセキュリティの関係についてまとめる。

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アプリケーションの脆弱性対策についてまとめる。

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>