Azure:如何在传入的Blob /文件进入Blob存储之前对其进行扫描?

时间:2019-04-10 06:06:23

标签: javascript azure azure-functions azure-storage-blobs clam

我目前正在创建一种病毒扫描功能。

我要执行的操作:将文件上传到指定的blob存储容器时,将触发Azure功能。该功能将扫描文件中是否有病毒,如果干净,会将文件移动到另一个Blob存储容器中。

我创建了一个Azure函数,该函数在创建Blob(即上传文件)时触发,但是我不知道如何将病毒扫描集成到混合中。

我尝试使用ClamAV.js,但无法正常运行。我不确定如何安装ClamAV(守护程序),以便它可以被Azure函数使用,因此这可能是导致它不起作用的原因。另外,我不确定如何安装npm软件包(在Azure函数中),因此我不得不将实际的js文件从软件包上传到函数中,然后将其导入。不知道那是否有效...

我尝试使用AttachmentScanner,但无法在Azure函数中正常运行(更具体地说,我无法获取发送POST请求的函数)。

我面临的一个主要问题是我认为我无法解决:如何在Azure函数中使用npm包?我可以将它们安装在某个地方吗?我可以直接下载软件包并将js文件手动上传到Azure函数并以这种方式导入吗?

这是我尝试使用AttachmentScanner的尝试:

module.exports = async function (context, myBlob) {
    var req = new XMLHttpRequest();
    req.open( "POST", "https://beta.attachmentscanner.com/requests", false );

    req.headers({
        "authorization": "bearer [OMITTED]",
        "content-type": "application/json"
    });

    req.type("json");
    req.send({
        "url": context.bindingData.uri //"http://www.attachmentscanner.com/eicar.com"
    });

    req.end(function (res) {
        if (res.error) throw new Error(res.error);

        context.log(req.responseText);
    });

    context.log("JavaScript blob trigger function processed blob \n Name:", context.bindingData.name, "\n Blob Size:", myBlob.length, "Bytes");
    context.log("context");
    context.log(context);
    context.log("myBlob");
    context.log(myBlob);
};

这会产生错误:Exception: ReferenceError: XMLHttpRequest is not defined

使用以下功能,我可以检测到斑点并打印有关它的信息:

module.exports = async function (context, myBlob) {    
    context.log("JavaScript blob trigger function processed blob \n Name:", context.bindingData.name, "\n Blob Size:", myBlob.length, "Bytes");
    context.log("context");
    context.log(context);
    context.log();
    context.log("myBlob");
    context.log(myBlob);
};

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

首先,我确定您无法将ClamAV安装到Azure Functions中,因此您需要创建一个Linux VM来进行安装。

接下来,您可以按照Visual Studio CodeAzure CLIPythonLinux之类的官方快速入门教程,在Windows的本地环境中安装Azure Functions Core Tool或Linux为Node.js创建一个func项目并将其发布到Azure。

最后,这是我对您的需求的看法。您可以尝试将Azure函数与Blob触发器一起使用,以为需要扫描的Blob生成带有sas令牌的url。有一个代码示例Node.js Azure Function for generating SAS tokens,您可以参考该代码示例知道该怎么做。然后,通过带有ClamAV.js的Node.js服务器将带有sas令牌的blob URL传递到VM中的ClamAV,以使用HTTP流对其进行扫描。

当然,您可以将ClamAV.js与Azure Functions集成,但是对于像Azure Functions这样的无服务器架构,长时间扫描一个大文件并不是一个好主意。希望对您有所帮助。