Django存储类,为所有存储文件分配随机文件名。
项目描述
Django-random-filestorage是一个Django存储类,为所有存储文件分配随机文件名。
如果用户上传一个名为foo.txt的文件,它将被存储为<60个随机字符>.txt。在您直接引用上传的文件或图片的情况下,这可以防止他们通过猜测用户使用的原始名称来找到其他文件,而这些文件他们可能没有权限查看。
文档
完整文档在https://django-random-filestorage.readthedocs.org。
安全警告
快速入门
安装django-random-filestorage
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文件中,这些文件通过Django应用中的FileField上传。正如Django建议的那样,媒体目录可以通过nginx或其他简单的Web服务器直接访问。因此,有权查看草莓菜谱的用户将被发送到类似以下链接的PDF:http://example.com/media/recipes/strawberry.pdf。他们不会在菜谱列表中看到水母,因为它太保密了。
然而,鉴于用户知道你还在卖水母,他们可以简单地通过以下链接找到那个菜谱:http://example.com/media/recipes/jellyfish.pdf!有很多情况下,不同访问级别的文档名称在某种程度上是可以预测的。日期也是另一个可预测的例子。FileField中的文件名是从用户选择的原始文件名派生出来的。
通过使这些文件名随机,可以访问http://example.com/media/recipes/ZXcAoL4wmhisYlBvHLoyt3fwfMXsMiVvgQTQOb40zOQIdag7KbEU5sy9b6GW.pdf的人将无法猜测水母菜谱可在http://example.com/media/recipes/qPRCEVAJd1RQvkd9OTTeY4hruW0Jvy5Qq0YIVtWPrwGWMgmUogYO8aPVRCxC.pdf找到。
哪些问题没有解决?
一旦用户知道了用于命名文件的随机字符串,他们可以将其链接提供给其他人。同样,他们也可以下载文件并以其他方式将其提供给其他人。
如果您想更严格地控制谁可以访问某些文件,您必须防止直接访问(媒体目录的)部分。您可以通过Django视图来提供这些文件,但这会增加额外的性能成本。一个更高效但更复杂的替代方案是使用Apache sendfile 或 nginx X-accel。
项目详情
django-random-filestorage-0.1.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9e0412dd3a9b23fa4b66812e3d17ea6ceebaf7838c5fb116cdcc746567ecf189 |
|
MD5 | 82f32ffc0a8fa3268ce5fbdc47149502 |
|
BLAKE2b-256 | c2e469e878e60e507103c31516c5504e63f20ef7f4eee9d8db366c56ba82ded8 |