2014-10-10 105 views
0

由於去年在我們的服務器上的攻擊,我已經阻止通過PHP所有的系統調用:沒有系統PHP異步調用

## php.ini 
disable_functions = exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source, eval 

但這已經停止我的異步函數的工作是用來在發送電子郵件背景。

有沒有一個純粹的PHP'安全'的方式來做一個異步調用,而無需再次打開exec()函數?

function doEmail($subject,$body,$to){      
    $pwd = realpath(dirname(__FILE__)); 
    $body = urlencode($body); 
    $subject = urlencode($subject); 
    $mailpage = $pwd."/email.php"; 
    $command = "$mailpage $subject $body $to"; 
    bgExecute($command);  

} 

## Asyncronous PHP - Multi-Tasking (Email etc) 
function bgExecute($command) { 
    if (substr(php_uname(), 0, 7) == "Windows") pclose(popen("start /B ". $command, "r")); // Windows 
    $exec = "/usr/bin/php -f $command > /dev/null &"; // Ubuntu 
    exec($exec);  
} 
+0

一個不同的路徑可能是將Web服務調用到您將其委託給的單獨服務。 – therealsix 2014-10-10 02:16:50

+0

謝謝,能否詳細說明一下? – crankshaft 2014-10-10 02:18:41

+0

其基本思想是將信息傳遞給具有完成工作能力的不同過程/系統。您可以通過設置一個Web服務(另一個監聽電子郵件信息的Web服務器)來做到這一點。您也可以將其寫入本地文件,並讓其他一些進程選取它。我確信有其他解決方案可以通過信息(套接字/中間件/等)。 – therealsix 2014-10-10 02:29:12

回答

0

那麼,如果你想繼續發送任意命令而不允許發送任意命令,那麼沒有。

如果你問的是如果有辦法按需執行PHP的外部應用程序,那麼是的。

一種方法是將您的命令寫入文件並讓另一個進程實際監視該文件以進行更改。

$filename = '/tmp/myfile.txt'; 
$prevMtime = 0; 
while (true) { 
    clearstatcache(); 
    //Do it in two steps just in case you have PHP < 5.4 
    $mtime = stat($filename); 
    $mtime = $mtime['mtime']; 

    if ($mtime > $prevMtime) { 
    $prevMtime = $mtime; 
    print("file ${filename} changed\n"); 
    } 
    usleep(10); 
} 

另一個將是使用套接字來實現相同的事情。

事情是,這些解決方案都不是銀色的子彈:如果你只是允許執行任意命令,那麼你幾乎沒有任何安全性。

您需要定義您需要多少安全性。那麼你需要決定你想要多少靈活性。

可以做的一種方式是通過配置一個進程(基於套接字或文件)來執行特定的可執行文件列表並讓PHP向其發送命令。