バイナリセーフ

バイナリセーフ(binary safe)とは、NULLバイトが文字列に入っていても、きちんと正しく取り扱うことのできる関数のこと。

PHPはファイルシステムに関する処理でC言語を使っている。で、制御文字には終端を意味する「\0」「\x00」「%00」といったものがある。$_POSTや$_GETなどでリクエストを受け取った際、その文字列の中に、これらの制御文字が入っていると、その制御文字以降に悪意あるコードが入っていても、終端を意味する制御文字で処理してしまう。つまり、悪意あるコードが存在していても無いものとして取り扱われてしまう。そうなると、ヌルバイト攻撃を受けてしまうことがある。

バイナリセーフな関数

バイナリセーフの関数は、こういった制御文字をきちんと処理するため、「\0」「\x00」「%00」などが挿入されていても終端として取り扱わない。

非バイナリセーフな関数

一方、バイナリセーフではない関数は、上記のようなヌルバイトを終端として取り扱ってしまう。また、古いPHPバージョンで使われていたeregなどは非バイナリセーフであり、NULLバイトが入っているとマッチングが正しく行われないケースが発生し、if文などの条件分岐でセキュリティをすり抜けてしまうことがある。尚、eregはPHP5.3.0で非推奨となり、PHP7.0.0で削除された。代替として、バイナリセーフのpreg_matchなどがある。

バイナリセーフの意味を簡潔に説明すると

NULLバイトが含まれていても正しく処理できる関数のこと。