2012-05-16 71 views
2

我试图从ASP.NET应用程序访问Amazon S3内容。我正在使用适用于.NET的AWS SDK工具包。目前,我使用GetpreSignedURL()函数来签署我的请求,然后我将IFrame src设置为URL。通过HTTP标头在Amazon S3中为.NET SDK签名请求

s3Placeholder.Text = ListingObjects(); 

GetPreSignedUrlRequest request = new GetPreSignedUrlRequest() 
    .WithBucketName(bucketName) 
    .WithKey("notebook.htm"); 

request.WithExpires(DateTime.Now.Add(new TimeSpan(7, 0, 0, 0))); 

string url = S3.GetPreSignedURL(request);  
this.Iframe2.Attributes.Add("src", url); 

问题是如果你看看IFrame的来源,你可以看到完整的字符串,包括访问密钥和签名。我想知道是否有更好的方法通过HTTP头来完成,以便登录安全信息不会通过查询字符串传递。

回答

2

你不能使用http头来验证请求,所以唯一的其他可能的选择是通过你的web服务器代理任何请求,但这会变得复杂并且消除了S3的许多好处。

但是,你在做什么并不是不安全的。预先签署的网址不会暴露您的密钥。它只能显示你的密钥(不需要保密)和使用密钥生成的签名(散列)。

您无法从url中取回秘密密钥。

您可以通过使用Amazons IAM创建只具有只读访问单个存储桶并使用这些凭据创建您的URL的用户,从而使事情更加安全。这样,即使攻击者以某种方式设法从url中反向设计密钥,他们所拥有的只是只能访问单个存储桶。