Amazon S3 Bucket策略权限Don';t允许Dropbox API从Bucket中提取文件


Amazon S3 Bucket Policy Permissions Don't Allow Dropbox API to Pull Files from Bucket

这让我整晚都疯了。

我用PHP/MYSQL写了一个DropBox应用程序,它运行得很好,它从Amazon S3 Bucket中提取文件,并将它们发送给用户的DropBox文件夹。

然后,我更改了AmazonS3 bucket上的bucket策略,只允许从少数引用者中提取文件,并对URLS进行了签名(例如:/musicfile.mp3?AWSAccessKeyId=[accesskeyid=&Expires=[Expires]&Signature=[Signature])。

这对所有用途都很好,除了我了解到我的Dropbox功能不再有效,这是因为你在Amazon S3上向Dropbox API传递mp3的URL,在Dropbox一侧,他们会将文件拉入,所以现在我有了只允许某些引用者的存储桶策略,Dropbox获得了拒绝的权限,API告诉它失败了。

所以我想简单的修复,我会简单地添加?AWSAccessKeyId=等等,直到文件的末尾被传递到dropbox,所有这些都会立即工作,但是,它没有工作,因为文件没有以dropbox识别的扩展名结尾,所以它再次无法工作。

然后我想我应该简单地将Dropbox中的referrer添加到我的bucket策略中,但我仍然不知道它是什么,并且添加了Dropbox.com和api.Dropbox的所有变体,无论是否使用https,都没有运气。

如果有人有任何想法或解决方案,你会认真地做我的一周。

我最不想做的事情就是被迫先将文件下载到我的服务器,然后发送到dropbox,我真的不想这样做,我知道我已经很好地完成了这项工作,当我完全删除我的bucket策略时,它会立即工作,我只想让它与它一起工作。

我认为,因为您提到将URL传递到Dropbox,所以您正在使用Saver?如果是这样,你可以告诉Saver要使用什么文件名,所以给它授权的URL并指定一个文件名,这样就有了文件扩展名。例如:

<a href="https://...?AWSAccessKeyId=..." class="dropbox-saver" data-filename="myfile.txt"></a>

或者,在JavaScript:中

Dropbox.save('https://...?AWSACcessKeyId=...', 'myfile.txt');

当你说"因为文件没有以Dropbox识别的扩展名结尾,所以它再次无法工作"时,你的确切意思是什么?当文件没有扩展名时会出现什么问题?

当所有其他操作都失败时。。。检查日志。

打开你的bucket的日志记录,运行一些测试,等待几分钟日志出现,然后检查日志以查看referer是什么。似乎不会有referer是安全的,因为不是web浏览器的用户代理(如Dropbox的后端进程)通常没有发送referer的理由。

如果说有什么安慰的话,那么通过约束裁判来"保护"一个吊桶就像根本不保护吊桶一样。击败它非常简单,因此它只有对两类人有效的保护:

  • 诚实的人
  • 懒惰的人

http://en.wikipedia.org/wiki/Referer_spoofing