Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用aws lambda作为s3的无服务器输入清理代理_Javascript_Amazon Web Services_Validation_Amazon S3_Aws Lambda - Fatal编程技术网

Javascript 使用aws lambda作为s3的无服务器输入清理代理

Javascript 使用aws lambda作为s3的无服务器输入清理代理,javascript,amazon-web-services,validation,amazon-s3,aws-lambda,Javascript,Amazon Web Services,Validation,Amazon S3,Aws Lambda,我希望使用预先签名的URL(S3)直接从客户端上传图像,我一直遇到以下两个障碍: 潜在的恶意文件和对输入(在我的例子中是图像)进行清理的需要 一次可能恶意上载过多文件 显然,这不能在客户机上完成,因为弱点仍然会暴露出来。据我所知,使用aws s3 bucket策略可以实现对文件扩展名的监控,但这并不是这个问题的真正解决方案 - 实际上,我会寻找文件清理SDK(对于这个项目,我使用node,所以完成这个服务器端将非常简单) AWS Lambda能否提供此类功能?对于这个用例,使用Lambda还有意

我希望使用预先签名的URL(S3)直接从客户端上传图像,我一直遇到以下两个障碍:

  • 潜在的恶意文件和对输入(在我的例子中是图像)进行清理的需要
  • 一次可能恶意上载过多文件
  • 显然,这不能在客户机上完成,因为弱点仍然会暴露出来。据我所知,使用aws s3 bucket策略可以实现对文件扩展名的监控,但这并不是这个问题的真正解决方案 - 实际上,我会寻找文件清理SDK(对于这个项目,我使用node,所以完成这个服务器端将非常简单)

    AWS Lambda能否提供此类功能?对于这个用例,使用Lambda还有意义吗?在我看来,通过lambda将图像传输到s3以在服务器端管道上“保存”似乎有点愚蠢,考虑到仍然需要双重上传。

    如果您根据需要生成预签名的url,并根据您的用例使其保持活动状态。因此,在这种情况下,当您需要时,预签名的url是实时的,并且对于所有客户端都是不同的。

    最后,我使用在专用api服务器上按需生成并发送到客户端的预签名POST数据实现了从客户端直接到s3的上传。不要与文件可以上传到的预签名url混淆,预签名数据用于编译html表单,提交所述表单后将上传文件

    使用节点aws sdk生成的服务器生成的PUT URL可以实现几个目标,即:

    • URL是“预签名”的,因此不需要进一步的身份验证,因此不需要在客户端上公开凭据

    • 可以将上载限制为某个密钥,并通过定义url的过期时间来限制上载时间。不用说,url最初仅限于用于签名url的凭据所限制的操作

    另一方面,预先签名的帖子数据需要更多的工作,但出于安全原因,它允许实施另一个关键限制:上传大小


    我的另一半问题与输入清理有关——通过我的服务器(标准方式)将文件路由到s3将允许我以我认为合适的任何方式清理输入。另一方面,客户端上载无法阻止恶意用户上载他们想要的任何文件,包括伪装为图像的恶意文件

    我第一次尝试在文件到达s3之前“捕获”文件-aws lambda函数将在s3之前接收照片,并充当某种代理,清理并只发送干净的数据-没有成功,因为使用api网关向lambda传输的数据有严格的限制-理论上是6mb,尽管在我的经验中不是这样。而且,这实际上意味着上传时间增加了一倍

    我的第二个解决方案最终对我有效——我编写了一个lambda函数,每次上传到相关bucket时都会触发该函数,并实现了两个约束:

  • 将每个用户文件夹保持在X mb以下(通过使用aws sdk提供的ListObject方法,并删除所有未进行X mb剪切的旧照片)

  • 使用节点“mmmagic”包清理每个上载的文件,并删除非图像的文件(检查文件扩展名很浅,无法安全区分图像和非图像)。起初,我还计划删除所有exif数据(因为exif数据可能包含恶意代码),但最终我没有这样做,因为这对于POC来说似乎太过分了


  • 使用这些功能(过期、服务器上的凭据、上载大小限制、文件夹大小限制、严格上载限制、删除非图像),我相信这是一个相当安全的(尽管从本质上讲不是这样)而且可以进行非常高效的上传。

    这还不能回答问题-如何实现非客户端验证。您可以保护api调用以获取预签名url,预签名url的有效期仅为n秒