Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
MIMEヘッダエンコーディングは複雑すぎてつらい / MIME header encoding...
Search
とみたまさひろ
June 23, 2021
Technology
3
1.5k
MIMEヘッダエンコーディングは複雑すぎてつらい / MIME header encoding is hard
とみたまさひろ
June 23, 2021
Tweet
Share
More Decks by とみたまさひろ
See All by とみたまさひろ
日本MySQLユーザ会ができるまで / making MyNA
tmtms
1
440
Ruby on Browser - RubyWorld Conference 2024
tmtms
1
1.1k
Ruby on Browser
tmtms
1
1.8k
私のRSpecの書き方 / How I write RSpec
tmtms
5
1.9k
ショートカットと端末 / shortcut & terminal
tmtms
2
800
文字ときどきRuby / Character and Ruby (NSEG)
tmtms
2
2.1k
文字ときどきRuby / Character and Ruby
tmtms
0
830
Linux用キーリマッパーを作る技術 / How to make Key Remapper
tmtms
0
470
Net::SMTP
tmtms
1
320
Other Decks in Technology
See All in Technology
AIで進化するソフトウェアテスト:mablの最新生成AI機能でQAを加速!
mfunaki
0
140
LLM as プロダクト開発のパワードスーツ
layerx
PRO
1
240
От ручной разметки к LLM: как мы создавали облако тегов в Lamoda. Анастасия Ангелова, Data Scientist, Lamoda Tech
lamodatech
0
710
サーバレス、コンテナ、データベース特化型機能をご紹介。CloudWatch をもっと使いこなそう!
o11yfes2023
0
170
Webアプリを Lambdaで動かすまでに考えること / How to implement monolithic Lambda Web Application
_kensh
7
1.3k
バクラクの認証基盤の成長と現在地 / bakuraku-authn-platform
convto
1
380
アジャイル脅威モデリング#1(脅威モデリングナイト#8)
masakane55
3
200
Terraform Cloudで始めるおひとりさまOrganizationsのすゝめ
handy
2
170
日経電子版 for Android の技術的課題と取り組み(令和最新版)/android-20250423
nikkei_engineer_recruiting
0
120
クォータ監視、AWS Organizations環境でも楽勝です✌️
iwamot
PRO
1
300
新卒エンジニアがCICDをモダナイズしてみた話
akashi_sn
2
220
Road to Go Gem #rubykaigi
sue445
0
430
Featured
See All Featured
Designing Experiences People Love
moore
141
24k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.2k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
What's in a price? How to price your products and services
michaelherold
245
12k
A designer walks into a library…
pauljervisheath
205
24k
Scaling GitHub
holman
459
140k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.7k
How STYLIGHT went responsive
nonsquared
99
5.5k
Navigating Team Friction
lara
184
15k
The Pragmatic Product Professional
lauravandoore
33
6.5k
Transcript
MIMEヘッダエンコーディングは MIMEヘッダエンコーディングは 複雑すぎてつらい 複雑すぎてつらい 2021-06-22 とみたまさひろ 1
別にしらなくてもいい 役に立つか立たないかわからない 技術について語るコーナー 2
MIMEヘッダエンコーディング MIMEヘッダエンコーディング メールのヘッダでよく見る =?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?= みたいなやつ 3
RFC 2047 RFC 2047 Message Header Extensions for Non-ASCII Text
メールのヘッダは ASCII のみ ASCII以外の文字列をヘッダに書けるようにするために 作られた規格 https://tools.ietf.org/html/rfc2047 4
Bエンコーディング: Qエンコーディング: 「日本語ABC」を変換すると: =?[文字コード]?B?[Base64化されたデータ]?= =?[文字コード]?Q?[そのまま書けない文字を=XXに変換したデータ]?= =?ISO-2022-JP?B?GyRCRnxLXDhsGyhCQUJD?= =?ISO-2022-JP?Q?=1B$BF|K\8l=1B(BABC?= =?UTF-8?B?5pel5pys6KqeQUJD?= =?UTF-8?Q?=E6=97=A5=E6=9C=AC=E8=AA=9EABC?= 5
エンコードのつらみ エンコードのつらみ 6
Bエンコーディングは基本的には文字列をBase64化して 前後に文字列をつけるだけ 日本語 → 5pel5pys6Kqe → =?UTF-8?B?5pel5pys6Kqe?= つらくない 7
↓ 長い… Subject: MIMEヘッダエンコーディングは複雑すぎてつらい Subject: =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+ikh+mbkeOBmeOBjuOBpuOBpOOCieOBhA==?= 8
メールのヘッダだから折り返しちゃえ! ダメ 折り返せるのは空白文字の箇所だけ Subject: =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+ik h+mbkeOBmeOBjuOBpuOBpOOCieOBhA==?= 9
複数のエンコーディング文字列に分割する エンコーディング文字列間の空白は取り除かれる仕様 だからよさそう でも実はこれでもダメ Subject: =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+ik?= =?UTF-8?B?h+mbkeOBmeOBjuOBpuOBpOOCieOBhA==?= 10
文字を分割しちゃダメ 「複」(E8 A4 87) が分割されてしまっている =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+ik?= → MIMEヘッダエンコーディングは<E8><A4> =?UTF-8?B?h+mbkeOBmeOBjuOBpuOBpOOCieOBhA==?= →
<87>雑すぎてつらい 11
文字単位で処理しないといけない =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+==?= → MIMEヘッダエンコーディングは =?UTF-8?B?6KSH6ZuR44GZ44GO44Gm44Gk44KJ44GE?= → 複雑すぎてつらい 12
さらに ISO-2022-JP のような状態を持つ文字コードの場合は ASCII で終了しないといけない <ESC>$B : JIS X 0208
<ESC>(B : US-ASCII 日本語ABCあいう → <ESC>$BF|K\8l<ESC>(BABC<ESC>$B$"$$$&<ESC>(B 13
これは OK <ESC>$BF|K\8l<ESC>(BABC⏎ 日本語ABC <ESC>$B$"$$$&<ESC>(B あいう 14
これはNG <ESC>$BF|K\8l<ESC>(BABC<ESC>$B$"⏎ 日本語ABCあ $$$&<ESC>(B いう 15
やるならエンコーディング文字列の最後にASCIIに戻す <ESC>$BF|K\8l<ESC>(BABC<ESC>$B$"<ESC>(B⏎ 日本語ABCあ <ESC>$B$$$&<ESC>(B いう 16
デコードのつらみ デコードのつらみ 17
文字が分割されている =?UTF-8?B?44GC44GE44GG44GI44E=?=⏎ あいうえ<E3><81> =?UTF-8?B?iuOBi+OBjeOBj+OBkeOBkw==?= <8A>かきくけこ ↓ あいうえ???かきくけこ 18
エンコーディング文字列がつながってる 本当はデコードしちゃダメ =?UTF-8?B?44GC44GE44GG44GI44GK?==?UTF-8?B?44GL44GN44GP44GR44GT?= 19
「"」で括られている 添付ファイル名とかでよく見る 本当はデコードしちゃダメ "=?UTF-8?B?44GC44GE44GG44GI44GK?=" 20
ISO-2022-JP と書かれてるのに ISO-2022-JP に無い文字が含まれている 「ア」「①」「Ⅲ」「㍻」「髙」など 本当はダメなんだけど普通に使われてる ISO-2022-JP じゃなくて CP50221 として扱う
21
つらい 😇 つらい 😇 22