2014-10-10 67 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向其发送命令。