【PR】 足裏健康法・樹液シート
【PR】 ADSL徹底導入術:乗り換えの方も始めての方も
【PR】 Bフレッツ対応プロバイダ徹底比較
【PR】 TOEICテスト新公式問題集〈Vol.4〉
 

予期しない文字コードでPOSTされるケース

Shift_JISで入力フォームを作成すれば、Shift_JISでデータが飛んでくるはず、というのはほとんどの方が思うことだと思います。EUC-JPで入力フォームを作成していれば、EUC-JPでデータはPOSTもしくはGETされると。

ところが、そうとも言い切れないケースに出くわしたことがあります。もちろん、ユーザーがHTMLソースを、本来とは異なる文字コードで保存しPOSTしてくれば、予期しない文字コードのデータが飛んでくることになりますが、そんなことではなくてです。(想定外の文字コードで送信してくる攻撃については、「文字コードとセキュリティ」の章で説明します。)

Mac版ネットスケープ4.7では、直前に訪問したホームページの文字コードをそのまま引きずってしまうというバグがあります。そのため、例えば、EUC-JPで作成した入力フォームから、外部のページ(Shift_JIS)へリンクしていると、そのリンクをユーザーがクリックしてそのShift_JISで作成されたページを訪問後、入力フォームのsubmitボタンをクリックすると、Shift_JISでPOSTされます。

例えば、プログラムはEUC-JPで作成しているが、そのページから静的ページである規約のページ(Shift_JIS)にリンクを貼っていた場合に、その規約ページをクリックしてsubmitボタンをクリックすると、Shift_JISでPOSTされます。そのため、例えば、

<input type=radio name=sex value="男" checked> 男   <input type=radio name=sex value="女"> 女

というようなページを作成していた場合に、受け取った値を見てみると、男でも女でもない値がPOSTされていることがありうるという話(Shift_JISの「男」である「0x926a」や「女=0x8f97」がPOSTされる)です。妥当性チャックで、本来予定していた値以外のものがPOSTされたらエラーにしなければなりませんので、これはエラーになります。

Mac版ネットスケープ4.7でこのような不具合があることを知らなかった私は、ずいぶん悩みました。幸いなことに、自分でテストしている際に気がついたので、「攻撃かもしれない」などと余計なことは考えずに済んだということがありました。

対処策として考えられるのは、

  • EUC-JPからShift_JISへのページへのリンクを外す。もしくは、リンクされているページをEUC-JPで作成しなおす。
  • PHPならmb_detect_encoding、perlならjcode.plやjcode.pmを使って、POSTされたデータの文字コードを自動取得し、想定外の文字コードであれば、想定している文字コードに変換してあげる。
  • HPならmb_detect_encoding、perlならjcode.plやjcode.pmを使って、POSTされたデータの文字コードを自動取得し、想定外の文字コードであれば、エラーにする。「戻るボタンをクリックして、もう一度POSTしてください」と表示する。再び、Shift_JISのページへのリンクをクリックしない限り、今度はEUC-JPでPOSTされます。
  • ユーザーへ、ネットスケープ6.0などへのupgradeを薦める
のような感じになると思います。なお、この不具合はWindows版ネットスケープ4.Xでは発生しませんでした。

次のページは、Windows版ネットスケープ4.Xで、右クリックを禁止すると、フォームの中で日本語入力が文字化けしまくる現象について考えます。