2011-10-09 83 views
6

当你在一个社交网站如Twitter个人资料图片,它们存储的图像文件,如:为什么随机存储云存储/ CDN的文件名?

http://a1.twimg.com/profile_images/1082228637/a-smile_twitter_100.jpg 

,甚至有地方约会路径类似20110912.唯一直接的好处,我能想到的阻止bot以线性方式通过并下载存储中的所有文件。我错过了其他好处吗?什么是最好的方法去随机化它?

我正在使用Amazon S3,因此我将有一个子域服务于我的所有静态内容。我的计划是在我的数据库中存储一个整数ID,然后将该URL与该ID进行连接以形成位置。

回答

11

我在公共URL中使用密码加密标识符的一个原因是,企业的增长速度并不总是公开的。

如果可以简单地通过创建新用户帐户或上传图像来推导当前的id,那么外部人员可以通过定期这样计算增长率(或上限)并查看有多少个ID在经过的时间内使用。

无论是停滞不前还是呈指数级增长,我希望能够控制这些信息的发布,而不是让竞争对手或业务分析师自己推断出来。

这是一个离线的例子是发票和支票号码。如果您定期收到公司的付款或付款,那么您可以看到他们在此期间写了多少发票或支票。

下面是使用基于鲣双向加密CPAN(Perl的)模块,我认为,搅乱32位的ID:

http://metacpan.org/pod/Crypt::Skip32

这是写在Skip32算法的直接翻译下用格雷格玫瑰:

http://www.qualcomm.com.au/PublicationsDocs/skip32.c

此方法的使用将每个32位id映射到一个(有效随机)对应的32位数字,该数字可以反转回原始ID。您不必在数据库中另存任何内容。

我将加密的id转换为8位十六进制数字以显示在URL中。

一旦您的ids接近42.9亿(32位),您需要计划扩展URL结构以支持更多,但我希望尽可能缩短URL。

+0

我喜欢这种思路。我将不得不重新考虑我的id生成策略。 – Adam

2

它主要防止名称冲突。例如,不止一个人可能会上传“IMG_0001.JPG”。您还可以避免限制一个目录中的文件数量,并且可以在多台服务器上分割图像 - 无论如何,像Twitter或Facebook这样的大型网站都无法将所有照片存储在一台服务器上,无论它多大。

+0

我明白你的意思,但Twitter使用Amazon S3,因此他们不必担心服务器或目录的概念。他们可以在一个目录中存储万亿个对象(或者它们的数量),而且不用担心。就我而言,我在MySQL中使用自动递增整数列作为S3上的相应文件名,因此命名冲突不应该成为问题。那么你认为有一个好的方法可以防止僵尸程序系统地下载你的所有文件吗? – Adam

+0

他们肯定地狱不得不担心,如果他们想要列出目录中的文件寻找特定的文件。 – ceejayoz

+0

他们必须在其他地方存储关于文件位置的元数据(数据库,JSON文档等)。我知道Twitter使用Amazon S3的一个事实,如果他们真的想,他们可以将所有图片存储在a1.twimg.com/*下。亚马逊的云处理硬件的程度很高,因此您不必在目录方面进行思考。由于我特意询问S3,在这种情况下分片和集群不是问题。 – Adam

4

更改URL是使过时资产无效的安全方法。

如果您想允许用户存储私人图像,这也是一种必要。将资产存储在CDN上后,使用用户帐户名称/ ID /路径的可抵扣路径将使隐私设置无效。