PHP eval 没有正确执行

PHP eval not executing properly

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

<?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);

?>

我正在尝试执行字符串 $acuman,一个已被各种 str_replace 函数更改的 heredoc。但是,它 not 正在做我打算做的事情,我很困惑,因为我尝试了很多不同的事情。

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

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

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

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

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

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

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

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

不用说:不要将此代码用于生产。代码本身非常脆弱,允许用户将原始 PHP 代码传递给您的脚本以执行。这段代码的功能可以用更安全的方式完全重写,但是你已经表达了继续使用的愿望eval();所以请小心。

尽情享受吧。

您的参数顺序错误:

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

strpos() 将 "haystack"(正在搜索的字符串)作为第一个参数,将 "needle"(要在 "haystack" 中查找的字符串)作为第二个参数.