我使用S3服务作为本地运行的软件(C#)的视频提供商
。出于安全问题,我为文件生成签名URL(临时URL),然后传递给视频播放器,但是如果我在亚马逊员工发布的帖子中将“_”(下划线)的“=”(相等)字符换成此线程上的“https://forums.aws.amazon.com/thread.jspa?messageID=245291”,则播放器只能读取该链接。
这里开始我的问题,当我发送视频URL而不更改此字符它不起作用
如果我不更改字符,但文件权限是“仅经过身份验证的用户”,我可以访问该文件但视频播放器不能因为字符问题。
如果我更改字符并将URL发送到播放器,它只有在文件访问权限为“每个人都可以读取/更改”并且使我的“安全解决方案”成为不安全的选择时才会起作用,如果有人获得了URL,他将会有权访问该文件。
是亚马逊的一个错误吗?有人 有解决方案吗?
这里有一个Singed URL示例:
的http:// 斗名称 .s3.amazonaws.com / video.flv AWSAccessKeyId = AKIAILVSCA2AWHA7KM6Q&安培;过期= 1307378448&安培;签名= FzWAI4dd8BfnzfCtbtAumQyiNvk%3D
这里有一个Changed Characters Singed URL示例:
的http:// 斗名称 .s3.amazonaws.com / video.flv AWSAccessKeyId_AKIAILVSCA2AWHA7KM6Q&安培; Expires_1307378448&安培;签名= FzWAI4dd8BfnzfCtbtAumQyiNvk%3D
答案 0 :(得分:0)
这里有很多事情发生。
首先,您提供的链接是关于Cloudfront网址的。我不认为有可能替换S3网址中的字符。
其次,您不应在=
,AWSAccessKeyId
和Expires
之后直接更改Signature
符号。问题字符只是出现在签名字符串中的字符。在您的示例中,最后的%3D
在编码的网址中为=
,而这正是您需要更改的内容。
但问题是,如果您更改该字符,则签名不再有效,这就是无法再访问私有内容的原因。公共内容可以访问,因为亚马逊会忽略网址的身份验证部分。
我遇到类似的问题,如果网址中有+
(%2b
)个字符,则基于Silverlight的视频播放器会失败。我通过在循环中生成一个新url来解决这个问题,直到我有一个没有无效字符的url。关键是要稍微改变到期时间,以便改变生成的签名。
以下是使用AWS开发工具包的示例。 (从vb.net转换,所以我希望语法正确)
using (AmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client(AWSKey, AWSSecretKey)) {
string url = null;
int secs = 0;
do {
var req = new Model.GetPreSignedUrlRequest {
BucketName = bucket,
Key = key,
Protocol = Model.Protocol.HTTP,
Verb = Model.HttpVerb.GET,
Expires = DateTime.Now.AddDays(ExpiryInDays).AddSeconds(secs)
};
url = client.GetPreSignedURL(req);
secs += 1;
} while (url.ToLower().Contains("%2b"));
return url;
}
根据我的经验,性能影响可以忽略不计,因为通常只需要几次迭代来确保“干净”的网址。