ヌルバイトとセキュリティー : PHP

Pocket

ヌルバイトをPHPは8進数表記では\0、16進数表記では\x00と表す(パーセントエンコードは%00)。

ヌルバイト攻撃の概要

ヌルバイトを文字列の終端と解釈する関数がある(バイナリセーフでない関数)。
バイナリセーフでない関数はヌルバイト以降の文字列を無視する。

下記コードはfalseを返す(ereg_matchはバイナリーセーフでない関数の例)。

ereg_match('[a-zA-Z0-9]','&\x00A') 

上記のマッチング対象は実質&だけになる。

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

バイナリセーフな関数の例 preg_match

ヌルバイト(\0, \x00)を通常の文字として認識する関数。

preg_match('/[a-zA-Z0-9_]/','&\x00A')  → true

preg_matchは\x00を文字列の終端と認識しない。最後のAとマッチしてtrueを返す。

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

ヌルバイト(\0, \x00)を文字列の終端と認識する関数。

ereg_match('[a-zA-Z0-9_]','&\x00A') → false

ereg_matchはは\x00を文字列の終端と認識する。最後のAとはマッチせずにfalseを返す。マッチ検査対象文字列は&のみとなる。

参考URL

»PHP と Web アプリケーションのセキュリティについてのメモ
»PHPメモ

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。