Javascript 使用aws lambda作为s3的无服务器输入清理代理
我希望使用预先签名的URL(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还有意
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时都会触发该函数,并实现了两个约束:
使用这些功能(过期、服务器上的凭据、上载大小限制、文件夹大小限制、严格上载限制、删除非图像),我相信这是一个相当安全的(尽管从本质上讲不是这样)而且可以进行非常高效的上传。这还不能回答问题-如何实现非客户端验证。您可以保护api调用以获取预签名url,预签名url的有效期仅为n秒