【问题标题】:PHP async without system calls没有系统调用的 PHP 异步
【发布时间】:2014-10-10 10:24:11
【问题描述】:

由于去年对我们服务器的攻击,我已经阻止了所有通过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);    
} 

【问题讨论】:

  • 另一种方法可能是对您委派给的单独服务进行 Web 服务调用。
  • 谢谢,你能详细说明一下吗?
  • 基本思想是将信息传递给有能力完成这项工作的不同进程/系统。您可以通过设置 Web 服务(另一个 Web 服务器侦听电子邮件信息)来做到这一点。您也可以将其写入本地文件,并让其他进程获取它。我确定还有其他解决方案可以传递信息(套接字/中间件/等)。

标签: php


【解决方案1】:

好吧,如果你想继续发送任意命令而不允许发送任意命令,那么不。

如果您要问的是是否可以通过 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 向它发送命令。

【讨论】:

    猜你喜欢
    • 2011-04-29
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多