UTF-7のセキュリティ

UTF-7といえばセキュリティでしか聞かない名前ですが,ちょっと調べてみたのでメモ.

UTF-7

UTF-7 - Wikipedia

7bitでだいたいの文字列を表現できる西洋の言語に対して,日本語などのマルチバイト文字を扱う方法が必要である.SMTPは8bit-cleanであることが保証されていない*1ので,メールではbase64エンコードなどが使われている.
ただ,base64エンコードは普通のascii文字列も変換してしまうので人間が見たときに読みづらい.なるべくascii文字列はそのままにしてそれ以外の文字だけを特別にエンコードする方法が欲しかった.

テーブルを見るからに怪しいエンコーディングである.

http://gyazo.com/86c3b4992529e5e68643374e576d5005.png

ブラウザの脆弱性

第1回 UTF-7によるクロスサイトスクリプティング攻撃[前編]:本当は怖い文字コードの話|gihyo.jp … 技術評論社

  • Internet ExplorerUTF-7でウェブページを解釈するときがある
  • ちゃんとcharsetを指定しましょう.
  • metaタグはtitleタグより前におきましょう.

Python

Pythonこんな風にエンコードを扱えます.

# -*- coding:utf-8 -*-
print(u"£1".encode('utf-7'))
# => +AKM-1

*1:8bit目はparityやflag(?)に指定されている http://en.wikipedia.org/wiki/8-bit_clean