PHPの識別子にアスキーコード0x7Fが使えることの検証
マニュアルにもしっかり書いてあるんだけどPHPの識別子にはアスキーコード0x7Fが使えるが、これは制御文字DELなので変じゃないかという指摘。試したところ確かに使える / “PHP :: Bug #71897 :: ASCII …” https://t.co/9CkFL2aziD
— 徳丸 浩 (@ockeghem) 2016年3月27日
ということなので、実際に試してみた。
どうせなら1つのソースコードで完結させてやろうということで得られたコードが以下。
<?php $name = "\x7F"; $expr = '$' . $name . '="b";var_dump($name, $' . $name . ');'; var_dump($expr); eval($expr);
これを実行すると、以下のように出力される。(0x7Fの部分は□で表している)
string(27) "$□="b";var_dump($name, $□);" string(1) "□" string(1) "b"
ちなみに、識別子の先頭文字としては使えない数字を入れてみたコード:
<?php $name = "1\x7F"; $expr = '$' . $name . '="b";var_dump($name, $' . $name . ');'; var_dump($expr); eval($expr);
を実行すると、ちゃんとエラーになる。
string(29) "$1□="b";var_dump($name, $1□);" PHP Parse error: syntax error, unexpected T_LNUMBER, expecting T_VARIABLE or '$' in /home/kajino/foo.php(6) : eval()'d code on line 1