2015-02-06 124 views
-3

有人能指出我在这里弄错了什么吗? :)PHP评估没有正确执行

<?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。然而,它正在做我打算做的事情,我很困惑,因为我尝试过很多不同的事情。

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

编辑:当我呼应字符串$acuman,这就是我得到:

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

+0

说什么是“没有做你打算做的事”而没有告诉你打算做什么几乎没用 – PeeHaa 2015-02-06 23:30:05

+1

你为什么这样做?并打印出$ acuman并查看它实际包含的内容 – ElefantPhace 2015-02-06 23:31:05

+1

您正在使用的最大错误是使用'eval()',如果包含用户输入则会加倍。我无法真正弄清楚你想在这里实现什么,但必须有更好的方法。 – 2015-02-06 23:32:46

回答

1

你以错误的顺序的参数:

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

strpos()采取“大海捞针”(被搜索的字符串)作为第一个参数和“针”(字符串,找到的“草垛”内)作为第二个参数。

+0

谢谢!你*实际上*回答了这个问题,而没有抱怨'eval()'。 – seanlevan 2015-02-07 00:14:06

+0

此外,谢谢你:它解决了这个问题。 :) – seanlevan 2015-02-07 00:18:45

+1

有些人对“eval”有一些误导性的仇恨,并且在任何机会上谴责它们,无论他们是否知识渊博,有些人认为newbs以他们不应该使用的方式使用它,并因此而大声疾呼,并且有些人认为它是有用的工具。 – AbraCadaver 2015-02-07 00:35:29

-1

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

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

这表示$q需要包含一部分"hello"以回显字符串"hello"

我看不出这里有什么问题,除非因为q就像是一个常数,而不是变量,也不是一个字符串常量数组索引处理$q = $_GET[q];不会与任何现代版本。关于这个问题见this PHP documentation

改为$q = $_GET['q'];而不是(注意引号),看起来这个代码实际上起作用。只要将"hello"的任何部分传递给URL参数(传递给PHP代码),它就会输出"hello"

不用说:不要使用此代码进行生产。原来的代码非常易受攻击,并且允许用户将原始PHP代码传递到您的脚本中执行。该代码的功能可以以更安全的方式完全重写,但是您已经表达了继续使用eval();的愿望,所以请小心。

享受。

+0

感谢您的警告,同时仍然保持平民! :) – seanlevan 2015-02-06 23:57:11

+0

有一件事:代码*仍*无效。 – seanlevan 2015-02-06 23:59:32

+0

另外,奇怪的是'$ _GET [q]'不起作用,即使它不正确,因为我以前做过很多次了。仍然,很好的答案。 – seanlevan 2015-02-07 00:00:05