バイナリセーフ
文字列にヌルバイトが含まれていても正しく(=文字列の終端とはせず)扱ってくれる関数を指す。逆に非バイナリセーフな関数はヌルバイトを終端だと見なしちゃうので、以降のデータを正しく扱えない。
ヌルバイト攻撃
if ( binary_unsafe(x) ) {
binary_safe(x);
}
って言うコードがあってxにヌルバイトが "hoge\0danger" こんな感じで入ってると、binary_unsafeのチェックをすり抜けて、binary_safeで実行されちゃう可能性があるよ、という話。
非バイナリーセーフ関数
PHPだと
バイナリセーフではない関数の一部
ereg_replace(), eregi(), eregi_replace(),
split(), spliti(),
include(), include_once(), require(), require_once()
fopen(), file_get_contents(), readfile(), basename()
http://itpro.nikkeibp.co.jp/article/COLUMN/20070402/267126/
という風に書かれていたが、Perlだとどうなんだろうか。
$ perl -E '$x="a\0b"; say length $x' 3 $ perl -E '$x="a\0b"; say join(qq|\n|, split //,$x)' a b
少なくともlengthとsplitはバイナリセーフみたい。ちょっと調べても出てこないので、基本すべてがバイナリセーフなのかな..