为所有存储文件分配随机文件名的django存储类。

django-random-filestorage的Python项目详细描述


https://badge.fury.io/py/django-random-filestorage.pnghttps://travis-ci.org/erikr/django-random-filestorage.png?branch=masterhttps://coveralls.io/repos/erikr/django-random-filestorage/badge.png?branch=master

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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用McClickListener单击了什么元素   Java时间戳在Oracle时间戳中不同情况下存储12 PM的奇怪行为   java无法使用事件总线对运行在不同机器上的垂直体进行通信   java Mockserver:收到请求后进行回调   java无法将Json字符串转换为Map<string,Object>   java如何按升序排列输出?   java视图行,带有oracle键。jbo。在SrCategoryParentIterator中找不到键[300100120394155]   javafxmysql连接示例   java正在等待加载完成   java是否可以将同一个有状态会话bean实例注入多个其他会话bean?   java无法让万向节检测离开或进入区域   使用JavaCV和OpenCV的java提供了dyld:lazy符号绑定失败:找不到符号:__sincos_stret   xml解析无法使用Java读取xml文档   java无法更改工具栏的颜色   javaapachesshd和JSCH   java无法在firebase存储中检索图像url   java问题与executeUpdate   同一应用程序中不同活动之间的java SharedReference