バイナリセーフ

文字列にヌルバイトが含まれていても正しく(=文字列の終端とはせず)扱ってくれる関数を指す。逆に非バイナリセーフな関数はヌルバイトを終端だと見なしちゃうので、以降のデータを正しく扱えない。

ヌルバイト攻撃

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はバイナリセーフみたい。ちょっと調べても出てこないので、基本すべてがバイナリセーフなのかな..