デコードの重複注意ポイント
デコードの重複 複数回のデコード処理が重複して実行されることで問題が発生することがある。 複数人でアプリケーションを開発するようなケースにおいて,プログラマの誰もがデータ処理の直前にデコード処理を通す習慣をつけていたとする。この場合,単体でのテストではデコード処理は一度しか行われないため,正常に動作するだろう。しかし,システムとして統合した場合,複数段階のデータ処理を経る際に本来不必要な複数回のデコードが行われてしまう。 上記のdecode2プログラムに相当するデコード処理を重複して行った場合,データの内容に問題が生じないケースとデータの内容が損なわれるケースの2つを示したものである。(a)は2回デコードしても実害がない例である。これに対して(b)は入力として「%83e%83X%83g%2500%8A%EB%8C%AF」を与えて2回目のデコード処理でエラーになるケースだ。これは,最初の文字列中に「%2500」という部分が含まれているのが原因である。「%25」は「%」を表すエンコードであるため,「%2500」は1回目のデコード処理で「%00」に変換される。2回目のデコード処理では「%00」をデコードすることになり,ナル文字が発生してエラーになるのである。このような問題を避けるため,エンコード文字列に対するデコード処理が行われるべきタイミングは1箇所に絞らなければならない。 クエリストリングを用いたWebアプリケーションでは,URLの後ろに,URLとキーワードの区切り文字「?」が入り「キーワード= 値」の形式でWeb サーバに送られてくる。複数のキーワードを用いたクエリストリングでは各キーワード間は「&」を使用し区切られる。このようにして渡されるクエリストリングは,その全体をデコード処理後,区切り文字「&」で各キーワードを切り出す方法を用いると1回ですべてのデコード処理を行うことができるため,とても効率的であるように思える。 しかし,このような方法は決して採用してはならない。なぜなら,エンコード文字列に「%26」や「%3D」といったデータが含まれる場合があるからである。この「%26」,「%3D」に対してデコード処理を行うとそれぞれ「&」,「=」に変換される。これは,クエリストリングの区切り文字と同じであるため,キーワードを切り出す処理が,正常に動作しなくなってしまうのである。 このような問題を避けるには,キーワードを切り出す処理を実行した後に,各キーワードに対してデコード処理を行うようにする。デコード処理と部分列の切り出しの順序を誤ると,予期せぬ結果を生むことがある