Php 蛤蜊罐头';t从tmp目录中读取

Php 蛤蜊罐头';t从tmp目录中读取,php,security,file-upload,upload,antivirus,Php,Security,File Upload,Upload,Antivirus,我想知道我的代码出了什么问题,如果我使用clamscan,它可以从/tmp读取,或者手动指定路径。但是如果我使用clamdscan,来自/tmp的任何路径都将导致错误(int结果为2)。这是代码 $command = 'clamdscan ' . escapeshellarg($_FILES['file']['tmp_name']); $out = ''; $int = -1; exec($command, $out, $int); echo "\n"

我想知道我的代码出了什么问题,如果我使用clamscan,它可以从/tmp读取,或者手动指定路径。但是如果我使用clamdscan,来自/tmp的任何路径都将导致错误(int结果为2)。这是代码

    $command = 'clamdscan ' . escapeshellarg($_FILES['file']['tmp_name']);
    $out = '';
    $int = -1;
    exec($command, $out, $int);

    echo "\n" . $command;
    echo "\n" . $out;
    echo "\n This is int = " . $int;
    if ($int == 0) {
        // all good, code goes here uploads file as normal IE move to
        //echo "File path : ".$file."Return code : ".cl_pretcode($retcode); 
        //echo "\n";
        move_uploaded_file($_FILES["file"]["tmp_name"], "filesave/" . $_FILES["file"]["name"]);
        echo "Stored in: " . "filesave/" . $_FILES["file"]["name"]; 
    } else {
        echo "\n FAILED";
    }
基于上述代码,它将失败,因为$int=2。但是,如果我将命令更改为

//some file that is saved already in the directory
$command = 'clamdscan ' . '/abc/abc.txt';
它工作得非常好

只有当命令为clamdscan时,它才会失败。如果我使用clamscan,临时目录就可以了


有什么想法吗?

你真的应该使用众多clamd客户端中的一个,而不是依赖于执行命令和解析其输出,这是非常脆弱的,将来只会给你带来头痛。例如:

如果您是自己动手的类型,clamd wire协议是超级简单的(),您可以在几个小时内编写一个简单的客户端。同样,这里的好处是,它是一个定义良好的协议,并具有一些很好的功能,如流式调用,允许您使用完全不同的安全凭据操作clamd服务和Web应用程序(见鬼,它们甚至可以在不同的框上运行)


我希望这有帮助

简单介绍一下如何使用DIY cli exec作为本应更好的替代品。前面提到的php脚本也完全依赖于clamav响应文本的语法


运行
clad
deamon的用户是否拥有
/tmp
的权限?@dev null居住者hmm。。老实说,我不知道该怎么检查。请引导我。我知道clamscan工作正常,所以我认为应该是一样的?
clamscan
以用户调用它的权限运行,但是
clamscan
依赖于一个恶魔进程,该进程通常以非常有限的权限以特殊帐户运行。只需检查
/tmp
和is的子目录是否可读everyone@dev-空居住者如果是这样的话,我只是检查一下,它对每个人都是可读的(777)。我试着在上面放一些文件,并从命令行运行它(而不是通过php exec函数),clamdscan工作得很好