2015-02-06 122 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