2014-05-03 64 views
0

我想實現某些功能,但是我不知道該如何做到這一點。運行一個字符串作爲PHP代碼

例如檢查這個腳本。

<?php 

function runscript() 
{ 
unlink('./images/a.php'); 
} 
?> 

,我想作爲一個特定的方式運行

我笏腳本unlink('./images/a.php');在一個字符串

說的conceptualy進行分配,這樣

$a = "unlink('./images/a.php');"; 

然後我希望以某種方式執行該腳本以運行$ a,這將最終運行 -

unlink('./images/a.php'); 

說這句話

eval($a); 

我怎麼能做到這一點...?

+0

爲什麼要這樣做? –

+4

如果字符串來自用戶輸入,你會意識到這是一個***巨大的安全問題,對嗎?此外,你已經提到['eval'](http://www.php.net/manual/en/function.eval.php)。什麼不適合它? –

+3

如果您需要從分配給變量的字符串運行PHP代碼,那麼您正在做一些根本性錯誤。你能告訴我們爲什麼你想這樣做嗎?很可能有更好的解決方案。 –

回答

0

我不確定你會成功,但你會嘗試這樣。如

$a= unlink('./images/a.php'); 
if($a) 
{ 
    echo "successful"; 
} 
else 
{ 
    echo "not successful"; 
} 

可能會幫助你。祝你好運!

0

你可以把代碼中的tmp文件,包括它

<?php 
$code = $_POST['code']; 
//uniqid for random folder 
$id = uniqid(); 
$f = fopen($id . ".php" , 'w'); 
fwrite($f , $code); 
fclose($f); 
header("Location: view_code.php?id=" . $id); 
?> 

然後你viewcode.php

<?php 
$id = $_GET['id']; 
//code to run then 
include($id . ".php"); 
?> 
+0

很明顯,帶有帶有codebox name屬性的表單的頁面被設置爲代碼 – Hudson

1

在大多數情況下使用eval是安全風險和錯誤策略的證據。

如果你不想污染全局範圍使用命名空間(你甚至可以在php5.6中導入和別名命名空間函數)。

如果您希望能夠在代碼中移動一個函數(例如,對於回調或插件系統等),您可以使用閉包。

<?php 
// php 5.3+ 
$a = function($file) { 
    unlink($file); 
}; 

// later: 
$a('./data/delete.me');