第4回 その文字列はセーフ? 本当は奥深いデコード処理
杉山 俊春
株式会社ユービーセキュア
技術本部 テクニカルサービス部
セキュアオーディットコンサルタント
2008/1/18
| 今日も楽しいメッセンジャータイム! ところが、ジュンさんから飛んできたのはまったく読めないけど、どこかで見たような文字列でした。今回はHTTPを取り扱う上では欠かせない「パーセントエンコード」について、気をつけなくてはならないことを学んでいきましょう(編集部) |
単なる文字化けじゃない?! ナゾのメッセージ到来
@IT messenger v1.4 |
ジュン:%82%b1%82%f1%82%ce%82%f1%82%cd%81%5b クウ:お。こんばんは〜。こないだの勉強会はありがとうございました。楽しかったです♪ ジュン:%8a%79%82%b5%82%f1%82%c5%82%e0%82%e7%82%a6%82%bd クウ:ちょっとどしたんすか?! なんか文字化けしてますよっ。 ジュン:%95%b6%8e%9a%89%bb%82%af%82%b6%82%e1%82%c8%82%a2 クウ:むむむ…… ジュン:これで会話できるかな? って思ったけど唐突だったか〜 クウ:え? 文字化けしてるとかじゃなくてなんか意味あったんすか? ジュンそうそうー。パーセントエンコードで話し掛けてみたの クウ:ふむふむ。パーセントエンコードっすか。そういえばよく見る形だなって思ったです。 |

パーセントエンコード(いわゆるURLエンコード)とは、文字のコードを16進数で表し、「%xx」(xxは16進数)という形に変換するエンコード方式のことである。
URLに含まれる非ASCII文字および一部のASCII文字が「%xx」の形に変換される(RFC:3986では、percent-encodingとして解説されている)。例を挙げると、「半角スペース」のコードは「20」となるため、パーセントエンコードを用いて表現すると「%20」となる。
実際に、HTTP通信ではパーセントエンコードが、URLのパスおよびQueryString(GETパラメータ)部分や、リクエストボディ(Content-Typeがapplication/x-www-form-urlencodedの場合のPOSTパラメータ)などで頻繁に利用されている。
| POST /percent_encode.html?mode=%83e%83X%83g HTTP/1.0 Host: localhost User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9, text/plain;q=0.8, image/png,*/*;q=0.5 Accept-Language: ja,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Proxy-Connection: keep-alive Referer: http://localhost/percent_encode.html?mode=%83e%83X%83g Content-Type: application/x-www-form-urlencoded Content-Length: 56 name=%83N%83E&address=%93%8C%8B%9E%93s&button=%91%97%90M |
| リスト1 HTTP通信ではパーセントエンコードが利用されている |
HTTPにおいて、日本語などのマルチバイトで表現されたデータを送信する際には、パーセントエンコードが用いられることが多い。例えば、SHIFT_JISで書かれた「あ」であれば「%82%a0」、「い」であれば「%82%a2」という形に変換される。
Webアプリケーションなどでは、このパーセントエンコードにより記述された文字列から、元の文字列を取り出すための作業を行う必要があり、この処理をデコード処理と呼ぶ。通常のデコード処理では、「%xx」で記述された文字列は、コードが「xx」の文字に置き換えられ、パーセントエンコードを行う前の文字列に復元される。
@IT messenger v1.4 |
クウ:で、さっきのパーセントエンコードのやつは、なんていってたんですか? ジュン:そこは自分でデコードしてみてほしいな クウ:デコードっすか……。そこらへんは、モジュールに任せっきりだからやり方分かんないかもです…… ジュン:ふむ。デコード結果を出力する自分用のWebアプリとか作っておくと便利だよー。 クウ:なるほどぉ。そういうの手元に持っておいた方がいいかもしれないですねぇ。 ジュン:ま、取りあえずは、コマンドラインとかでデコードする方法を教えておくよ。 クウ:おおっ! ありがとうございます! |
デコードするのは意外と簡単、なのに「奥が深い」?
「あ」のような日本語がパーセントエンコードされた「%82%a0」が元の文字列に戻ったことを確認するには、実際に利用される環境と同じようにWebアプリケーションを利用して出力を行う形が確実である。
| <?php echo htmlspecialchars($_GET['text']); ?> |
| リスト2 PHPでデコードを行うシンプルな例 http://localhost/decode.php?text=[パーセントエンコード文字列]のような形でアクセスを行う |
また、Webアプリケーションを利用しない場合でも、以下のような手段で確認を行うことは可能である。
デコード方法例 |
|
| Windows | IMEの日本語入力で、「%」を取り除いた「82a0」と入力し、F5キーを押す (ASCII文字については先頭に「00」の補完が必要) |
| Linux | 以下のコマンドを実行 > echo '%82%a0' | tr % = | nkf -mQ |
| 表1 Windows、Linuxでのデコード方法例 |
@IT messenger v1.4 |
クウ:フムフム……。なるほど。パーセントエンコードってこんなんなってるんすねー。いままであんまりちゃんと考えたことなかったなぁ。 ジュン:%83%70%81%5b%83%5a%83%93%83%67%83%47%83%93 クウ:えっと。ちょっと待ってくださいね……。 ジュン:変換するのめんどくさくなってきたから普通に打つね(笑)。 クウ:はい。ぜひに(笑)。 ジュン:結構軽視されがちだけど、意外と理解しておかないといけないのよね、これが。 クウ:でも、これって、ブラウザとかモジュールとかが勝手にやってくれるからあまり意識しなくてもいいんじゃないですかね。 ジュン:それがそうでもないんだなー。 クウ:ほう……。そうなんですかぁ。 ジュン:ちと席外すねー。すぐ帰ってくるけど クウ:あ、はいー。 システム:ジュンは離席中です |
| クウ | 「パーセントエンコードはちゃんと勉強しておいた方がいいかもなあ……」 |

1/3 |
| Index | |
| その文字列はセーフ? 本当は奥深いデコード処理 | |
| Page1 単なる文字化けじゃない?! ナゾのメッセージ到来 デコードするのは意外と簡単、なのに「奥が深い」? |
|
| Page2 あれ、%00が表示されない?! |
|
|
Page3 制御文字がデコードできてしまうということは 入力と処理、それぞれの「バイナリセーフ」 |
もいちどイチから! HTTP基礎訓練中 バックナンバー
| もいちどイチから! HTTP基礎訓練中 連載インデックス |
TechTargetジャパン
- Facebook タイムライン利用時の「鉄則」 (2012/2/9)
ユーザーインターフェイスの変更措置に伴い浮上した、Facebookの「過剰な情報提供」のリスクと対策とは - 無料サービスなら通信内容を記録してもいいの? (2012/1/13)
無料の公衆無線LANサービスが、ユーザーに無断で通信履歴を記録していたことが判明し、話題に - 攻撃はまるでレーザービーム (2011/12/26)
2011年に話題となった標的型攻撃は「人」という弱点ををねらい打ちにしました。では、人に教育さえしておけば防げるものなのでしょうか? - 見せたくないなら「持たせない」が鉄則! (2011/12/15)
逆コンパイル対策で難読化したのに、大事なデータが解析されちゃった? Androidアプリのセキュリティの道は深い
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -
