为所有存储文件分配随机文件名的django存储类。
django-random-filestorage的Python项目详细描述
django random filestorage是一个django存储类,它为所有存储的文件分配随机文件名。
如果用户上载名为foo.txt
的文件,则
将存储为<60 random characters>.txt
。如果您直接向用户推荐上传的文件或图像,
这将阻止他们通过猜测原始文件来查找其他文件,而这些文件可能是他们无权查看的
用户使用的名称。
文件
完整的文档位于https://django-random-filestorage.readthedocs.org。
安全警告
警告
对于上载的文件可能包含链接的情况,不要使用django random filestorage, 例如pdf文件。在这种情况下,您的url的机密性可能会被 通过referer头泄漏,dropbox在5月份发现: https://blog.dropbox.com/2014/05/web-vulnerability-affecting-shared-links/
快速启动
安装django随机文件存储:
pip install django-random-filestorage
然后在整个django项目中使用它:
DEFAULT_FILE_STORAGE="randomfilestorage.storage.RandomFileSystemStorage"
或者,将其设置在特定字段上:
from randomfilestorage.storage import RandomFileSystemStorage random_storage = RandomFileSystemStorage(location='/media/my_files') class Example(models.Model): my_file = FileField(storage=random_storage)
你为什么要这样做?
假设你有一个应用程序管理你店里卖的所有冰淇淋食谱。你的一些食谱里有秘密 因此,只有一小部分受信任的用户可以使用我们来看看两种冰淇淋:草莓冰淇淋, 其中有一个相当标准和非秘密的食谱,水母,这是非常秘密的。
这些菜谱存储在pdf中,并上传到使用filefield的django应用程序中。正如Django所说, 媒体目录可以通过nginx或其他简单的web服务器直接访问。所以授权的用户 要查看草莓配方,将发送到一个pdf文件,如http://example.com/media/recipes/strawberry.pdf。他们 不会在他们的食谱中看到水母,因为这太秘密了
然而,考虑到用户知道你也卖水母,他们可以在 http://example.com/media/recipes/jellyfish.pdf!在许多情况下,文档的名称具有不同的访问权限 在某种程度上是可以预测的。日期是另一个可预测的例子。文件字段中的文件名是派生的 从用户选择的原始文件名。
通过随机设置这些文件名,可以访问 http://example.com/media/recipes/ZXcAoL4wmhisYlBvHLoyt3fwfMXsMiVvgQTQOb40zOQIdag7KbEU5sy9b6GW.pdf 我猜不出水母的食谱 http://example.com/media/recipes/qPRCEVAJd1RQvkd9OTTeY4hruW0Jvy5Qq0YIVtWPrwGWMgmUogYO8aPVRCxC.pdf。
哪些问题没有解决?
一旦用户知道用于命名文件的随机字符串,他们就可以提供指向其他人的链接。再说一遍, 他们也可以下载文件并以其他方式提供给其他人。
如果您希望对访问某些文件的人进行更严格的控制,则必须阻止直接访问(的一部分) 媒体目录。您可以通过Django视图来提供这些文件,但是 性能成本。一个性能更好但更复杂的选择是使用Apachesendfile或nginxX-accel