我想知道我的代码有什么问题,如果我使用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,临时目录就可以了
你知道吗?
3条答案
按热度按时间lztngnrs1#
你真的应该只使用众多clamd客户端中的一个,而不是依赖于执行命令和解析它的输出,这是超级脆弱的,将来只会给你带来头痛。例如:
http://torquecp.sourceforge.net/phpclamcli.html
如果你是自己动手的类型,clamp线协议是超级简单的(http://linux.die.net/man/8/clamd),您可能在几个小时内编写一个简单的客户机。这样做的好处是它是一个定义良好的协议,并且有一些很好的特性,比如流调用,它允许您使用完全不同的安全证书来操作clamd服务和您的webapp(见鬼,他们甚至可以运行在不同的盒子上)。
希望这能帮上忙。
u4dcyp6a2#
关于使用http://torquecp.sourceforge.net/phpclamcli.html作为DIY cli exec更好的替代品,我想简单说明一下,前面提到的php脚本也完全依赖于clamav响应文本的语法。
2ul0zpep3#
老问题,但我刚刚遇到了同样的问题。
clamdscan
作为用户clamav
运行,该用户没有权限访问/tmp
中的文件。还有一个额外的参数--fdpass
作为运行脚本的用户运行命令。使用
$command = 'clamdscan --fdpass' . escapeshellarg($_FILES['file']['tmp_name']);
时,应以www用户身份运行命令,该用户将有权访问临时文件。