Kou*_*sha 5 amazon-s3 amazon-web-services
我创建了一个预先签名的 URL 并返回类似
https://s3.amazonaws.com/MyBucket/MyItem/
?X-Amz-Security-Token=TOKEN
&X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Date=20171206T014837Z
&X-Amz-SignedHeaders=host
&X-Amz-Expires=3600
&X-Amz-Credential=CREDENTIAL
&X-Amz-Signature=SIGNATURE
Run Code Online (Sandbox Code Playgroud)
我现在可以curl这没问题。但是,如果我现在添加另一个查询参数,我将返回 403,即
https://s3.amazonaws.com/MyBucket/MyItem/
?X-Amz-Security-Token=TOKEN
&X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Date=20171206T014837Z
&X-Amz-SignedHeaders=host
&X-Amz-Expires=3600
&X-Amz-Credential=CREDENTIAL
&X-Amz-Signature=SIGNATURE
&Foo=123
Run Code Online (Sandbox Code Playgroud)
怎么来的?是否可以生成支持自定义查询的预签名 url?
在签名之前将自定义查询参数插入到 v4 预签名 URL 中似乎在技术上是可行的,但并非所有 AWS 开发工具包都公开了执行此操作的方法。
以下是使用 AWS JavaScript SDK 执行此操作的迂回方法示例:
const AWS = require('aws-sdk');
var s3 = new AWS.S3({region: 'us-east-1', signatureVersion: 'v4'});
var req = s3.getObject({Bucket: 'mybucket', Key: 'mykey'});
req.on('build', () => { req.httpRequest.path += '?session=ABC123'; });
console.log(req.presign());
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用以 X- 开头和没有它的自定义查询参数。两者似乎都运行良好。我试过使用多个查询参数 ( ?a=1&b=2) 并且也有效。
自定义的预签名 URL 可以正常工作(我可以使用它们来获取 S3 对象)并且查询参数将其放入 CloudWatch Logs,因此可用于关联目的。
请注意,如果您想提供自定义到期时间,请执行以下操作:
const Expires = 120;
const url = req.presign(Expires);
Run Code Online (Sandbox Code Playgroud)
我不知道其他(非 JavaScript)SDK 允许您像这样将查询参数插入到 URL 构建过程中,因此在其他语言中执行此操作可能是一个挑战。我建议使用一个小的 JavaScript Lambda 函数(或 API Gateway 加 Lambda 函数),它可以简单地创建并返回自定义的预签名 URL。
自定义查询参数也是防篡改的。它们包含在 URL 的签名中,因此,如果您篡改它们,URL 将变得无效,从而产生 403 Forbidden。
我使用此代码生成您的预签名 URL。结果是:
https://s3.amazonaws.com/MyBucket/MyItem
?Foo=123
&X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=AKIA...27%2Fus-east-1%2Fs3%2Faws4_request
&X-Amz-Date=20180427T0012345Z
&X-Amz-Expires=3600
&X-Amz-Signature=e3...7b
&X-Amz-SignedHeaders=host
Run Code Online (Sandbox Code Playgroud)
这些都不能保证这种技术会继续有效,当然,如果 AWS 改变了幕后的事情,但就目前而言,它似乎有效并且肯定有用。
归因:此发现的来源是aws-sdk-js/issues/502。
如果更改标题之一或添加/减去,则必须重新签名 URL。
这是 AWS 签名设计的一部分,此过程旨在提高安全级别。AWS 从签名版本 2 更改为签名版本 4 的原因之一。
签名设计不知道哪些标题重要,哪些不重要。如果试图跟踪所有 AWS 服务,那将是一场噩梦。
| 归档时间: |
|
| 查看次数: |
3832 次 |
| 最近记录: |