拒绝访问 - 通过Amazon S3上的签名URL流式传输视频

时间:2011-06-06 22:11:42

标签: amazon-s3 video-streaming

我使用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

1 个答案:

答案 0 :(得分:0)

这里有很多事情发生。

首先,您提供的链接是关于Cloudfront网址的。我不认为有可能替换S3网址中的字符。

其次,您不应在=AWSAccessKeyIdExpires之后直接更改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;

}

根据我的经验,性能影响可以忽略不计,因为通常只需要几次迭代来确保“干净”的网址。