PHP eval没有正确执行

时间:2015-02-06 23:26:59

标签: php eval heredoc

有人能指出我在这里的错误吗? :)

<?php

$q = $_GET[q];

$acuman = <<<PARSE

input: (contains: "hello"){

output: "hello";

}

PARSE;

$acuman = str_replace("input: (contains: ", 'if(strpos(', $acuman);

$acuman = str_replace("){", ', $q) !== false) {', $acuman);

$acuman = str_replace("output: ", '$output = ', $acuman);

eval($acuman);

?>

我正在尝试执行字符串$acumanheredoc已被各种str_replace函数更改。但是,not正在做我打算做的事情,我很困惑该做什么,因为我尝试过很多不同的事情。

由于很多人似乎很困惑:我的意图是将字符串$acuman中的代码正确地作为代码执行。我只想让eval函数起作用。我知道 eval是邪恶的,请停止:我只是寻求帮助来解决手头的问题。

编辑:当我回显字符串$acuman时,这就是我得到的:

if(strpos("hello", $q) !== false) { $output = "hello"; }

2 个答案:

答案 0 :(得分:1)

您的参数顺序错误:

if(strpos($q, "hello") !== false) { $output = "hello"; }

strpos()采取&#34; haystack&#34; (被搜索的字符串)作为第一个参数和&#34;针&#34; (字符串在&#34; haystack&#34;中找到)作为第二个参数。

答案 1 :(得分:-1)

好的,所以... $acuman似乎包含以下内容:

if(strpos("hello", $q) !== false) {
  echo "hello";
}

这表明$q需要包含"hello"的一部分来回显字符串"hello"

我在这里看不到任何问题, EXCEPT $q = $_GET[q];无法使用任何现代版本,因为q被视为常量,不是变量也不是字符串文字数组索引。有关该主题,请参阅this PHP documentation

更改为$q = $_GET['q'];后(注意引号),似乎此代码实际上有效。每当将"hello"的任何部分传递给URL参数(传递给PHP代码)时,它都会输出"hello"

毋庸置疑:请勿将此代码用于生产。代码本身非常容易受到攻击,并允许用户将原始PHP代码传递给脚本执行。此代码的功能可以以更安全的方式完全重写,但您已表示希望继续使用eval();,所以请小心。

享受。