由于去年我们的服务器遭到攻击,我已经通过php阻止了所有系统调用:
## php.ini
disable_functions = exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source, eval
但是这已经停止了我的异步功能工作,它用于在后台发送电子邮件。
在没有再次打开exec()函数的情况下,是否有纯粹的php'安全'方式进行异步调用?
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 :(得分:0)
好吧,如果你想继续发送任意命令而不允许发送任意命令,那么没有。
如果你问的是有没有办法按需执行外部应用程序,那么是的。
一种方法是将命令写入文件,并使另一个进程实际监视该文件以进行更改。
$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发送命令。