PHP
セキュリティ
NULL

バイナリセーフってなんだよ!?

PHPの本を読んでいたらバイナリセーフって単語が出てきてバイナリセーフなんだよ!? っとなりました。
よくわからないので自分なりに調べてみました。

バイナリセーフな関数

バイナリデータを正しく扱うことができる関数

バイナリセーフでない関数

バイナリデータを正しく扱うことができない関数

そもそもバイナリデータとは?

コンピュータが扱えるよう2進法に則って0と1の羅列(ビット列)として表現されたデータうち、テキスト(文字)形式ではない任意のデータ形式のこと。
http://e-words.jp/w/%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA.html より引用

結局、気をつけることは何?

バイナリセーフでない関数を使用するとNULLバイト攻撃にあう

Nullバイト攻撃とは?

nullバイト(「\0」、「\x00」などの終端文字とされている文字列)を含めることでセキュリティチェックをくぐり抜けてしまう。
ロケールに基づく文字列比較の関数(strcoll、strcmp)を使用して確認してみる。

サンプルコード

<?php

$str1 = 'こんにちわ\x00ゴリラくん';
$str2 = 'こんにちわ';

// strcoll ※バイナリセーフでない関数を使用
echo 'strcoll:' . strcoll($str1, $str2);

echo PHP_EOL;

// strcmp ※バイナリセーフな関数を使用
echo 'strcmp:' . strcmp($str1, $str2);

出力結果

strcoll:1
strcmp:19

\x00」がstrcollの時は1と認識され、strcmpの時は4と認識されるようだ

参考サイト