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" 中查找的字符串)作为第二个参数.
有人可以指出我在这里的错误吗? :)
<?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" 中查找的字符串)作为第二个参数.