为所有存储文件分配随机文件名的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如何拆分字符串(基于各种分隔符),但不保留空格?   解析。Json格式的txt文件和knime中的java   java Spring rest api为什么在rest api调用的响应中更改了数据类型   升华文本3抛出java。lang.ClassNotFoundException,而记事本++不存在   java Android指纹扫描仪在尝试5次后停止工作?   java Android如何设置精确的重复报警?   java如何使用HTTPGET connect为access API输入用户名和密码   java当测试报告显示没有测试失败时,Gradle为什么说“有失败的测试”?   用Gson实现java获取响应   MapReduce程序中函数错误的java不可映射参数   java spring安全性不符合自动代理的条件   java GWT使用异步回调进行同步/阻塞调用   java奇怪的类数组问题无法在jsp中显示   如何在java中使用PrinterJob使用epl打印条形码   java如何在JTable中居中单元格   将Java Mockito测试转换为Kotlin   html Java正则表达式模式匹配到多个相同标记   testCompile中缺少java Gradle(Android)多项目依赖项   在输入提示后输入字符串时发生java FileNotFoundException