有人能指出我在这里的错误吗? :)
<?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
,heredoc
已被各种str_replace
函数更改。但是,not
正在做我打算做的事情,我很困惑该做什么,因为我尝试过很多不同的事情。
由于很多人似乎很困惑:我的意图是将字符串$acuman
中的代码正确地作为代码执行。我只想让eval
函数起作用。我知道 eval是邪恶的,请停止:我只是寻求帮助来解决手头的问题。
编辑:当我回显字符串$acuman
时,这就是我得到的:
if(strpos("hello", $q) !== false) { $output = "hello"; }
答案 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();
,所以请小心。
享受。