php clamdscan无法从tmp目录读取

6za6bjd0  于 2023-01-19  发布在  PHP
关注(0)|答案(3)|浏览(176)

我想知道我的代码有什么问题,如果我使用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,临时目录就可以了
你知道吗?

lztngnrs

lztngnrs1#

你真的应该只使用众多clamd客户端中的一个,而不是依赖于执行命令和解析它的输出,这是超级脆弱的,将来只会给你带来头痛。例如:
http://torquecp.sourceforge.net/phpclamcli.html
如果你是自己动手的类型,clamp线协议是超级简单的(http://linux.die.net/man/8/clamd),您可能在几个小时内编写一个简单的客户机。这样做的好处是它是一个定义良好的协议,并且有一些很好的特性,比如流调用,它允许您使用完全不同的安全证书来操作clamd服务和您的webapp(见鬼,他们甚至可以运行在不同的盒子上)。
希望这能帮上忙。

u4dcyp6a

u4dcyp6a2#

关于使用http://torquecp.sourceforge.net/phpclamcli.html作为DIY cli exec更好的替代品,我想简单说明一下,前面提到的php脚本也完全依赖于clamav响应文本的语法。

2ul0zpep

2ul0zpep3#

老问题,但我刚刚遇到了同样的问题。clamdscan作为用户clamav运行,该用户没有权限访问/tmp中的文件。还有一个额外的参数--fdpass作为运行脚本的用户运行命令。
使用$command = 'clamdscan --fdpass' . escapeshellarg($_FILES['file']['tmp_name']);时,应以www用户身份运行命令,该用户将有权访问临时文件。

相关问题