その文字列はセーフ? 本当は奥深いデコード処理 − @IT

パーセントエンコードについて。結構%00とか使いますよねぇ(何

「パーセントエンコードは基本なようで奥が深いから押さえておいた方がいいよ!」

入力チェックを抜かす手法と、入力値以降を無効化指せるのと2影響があるそうです。

1. 入力チェックがバイナリセーフの関数、処理の実行が非バイナリセーフの関数

  • 入力チェック:abcd[NULL文字]efg
  • 処理の実行:acbd (NULL文字以降はないものとされる)

入力チェックで、NULL文字以降の文字列「efg」が入力チェックを通過する条件になっている場合(例えば後方一致など)に、処理の実行で本来あるべきNULL文字以降の文字列が存在しないため想定外の動作となる可能性が存在する。
2. 入力チェックが非バイナリセーフの関数、処理の実行がバイナリセーフの関数

  • 入力チェック:acbd (NULL文字以降はないものとされる)
  • 処理の実行:abcd[NULL文字]efg

非バイナリセーフの関数を用いた入力チェックでは、NULL文字以降がないものとされ、不正な文字が混入していても検知することができなくなる。しかし、入力チェックの後に同じ文字列に対しバイナリセーフの関数を使用すると、NULL文字以降に不正な文字が挿入されている場合、想定外の動作を行う可能性がある。

screenshot