LoginSignup
0
0

More than 1 year has passed since last update.

PHP evalでハマった

Posted at

レガシーコードのevalでハマり散らかしたので共有。

例えばこういう関数を定義して・・・

function foo($code, $val) {
    $res = eval($code);
    echo $res . PHP_EOL;
}

普通に呼び出す。

//出力したい文字列
$val = "Hello World";

//evalで実行するPHPコード(※再現するためにエスケープして埋め込んでます)
$phpCode = "echo \$val;";

foo($phpCode, $val);
Hello World

普通に動く。

ここからが本題

静的解析で未使用のパラメータがありますって言われるので、消すと・・・

- function foo($code, $val) {
+ function foo($code) {
      $res = eval($code);
      echo $res . PHP_EOL;
  }
PHP Notice:  Undefined variable: val in /file/path/index.php(7) : eval()'d code on line 1

何も出力されないという罠。
evalは文字列をPHPコードとして実行するので、文字列として埋め込まれた変数までは当然解析で追えない。

まとめ

デバッグが難解なレガシーコードはマジで怖いです。
PHPマニュアルにも危険って書いてあるし、使わなくても開発できる場面しか思い浮かばないので今後使うことは無さそう・・・。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0