我正在处理的应用程序允许用户在地图上创建商家,并上传相关图像。
我使用云功能调整各种屏幕分辨率的图像大小并将其上传回GCS。
为了让这些图像对公众可访问,我生成了签名的URL,该URL被保存在实时数据库中的关联实体中。
const [signedUrl] = await bucket.file(path).getSignedUrl({
action: "read",
expires: "01-01-2500",
})
直到今天,根据上面的代码生成的URL将允许任何人查看图像。然后突然,所有先前生成的URL变得无法访问,而是显示以下错误:
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.
</Message>
<StringToSign>
GET 16725225600 /project-name.appspot.com/placeImage%2F300w%2FUPfppRM1ZyjbwBNiakgzyQ%3D%3D.jpg
</StringToSign>
</Error>
我看到上面所有上传过的图片的消息。可以很好地查看新上传的图像。
我的代码非常模仿函数样本提供的this example,但是我担心如果问题再次出现,请将其投入生产。
这个问题可能是什么原因导致未来有什么方法可以保护自己免受攻击?
答案 0 :(得分:3)
似乎此问题与v4 URL的使用有关。
Google Cloud Functions中IAM的所有者在this comment中说明了您遇到的行为:
最近,GCS已经开始支持v4 URL。例如,默认情况下[gsutil]生成v4 URL。这些网址的有效期最长为7天。