什么是Django中敏感数据文件file_url的安全实现

时间:2015-12-13 17:51:19

标签: django file authentication django-models download

我向经过身份验证的用户提供敏感的用户名和密码文件。我希望用户通过模板中的file_url下载文件。

File_link = models.FileField(upload_to='SAFE_DIRECTORY_PATH')

我觉得把它存放在媒体目录中并不安全 任何保证他们安全的建议,网络应用程序都会生成链接。

1 个答案:

答案 0 :(得分:1)

首先是一些安全说明。

这可能是一个糟糕的想法。将敏感信息存储在普通文件中可能不是正确的安全方法,特别是如果您计划使用Django的媒体存储后端来执行此操作。它使所有文件都处于开放状态。

如果你真的,真的,我的意思是真的需要这样做,你应该在保存Django之前先加密文件。

但是,如果可能的话,我会建议在db中存储敏感信息。在存储密码的情况下,您可以使用Django技术相对安全地存储该信息,例如通过pbkdf函数正确散列密码(例如pbkdf或bcrypt等)。如果用户需要下载该信息,您可以随时生成该文件以供下载。

有关上传文件的一些建议。

我通常会将随机文件名分配给上传的文件。这种方式至少对用户来说更难以猜测下载它们的文件名。不是很安全,因为它依赖于混淆的安全性,但它更好,然后没有。如果您需要一个自动执行此操作的Django字段,您可以通过使upload_to成为可调用的方式来实现这一点(还有第三方库用于执行此操作,例如django-auxilium,但是对于完全泄露我是该作者的作者LIB)。

现在文件以随机文件名存储,您可能永远不想为用户提供直接下载链接以供下载,而是首先对其进行身份验证,然后在nginx或X-Accel中使用X-Sendfile之类的内容。 Apache实际上将文件提供给用户。这个想法是你首先在Django中验证用户。然后,不是Django为文件提供服务,而是返回一个特殊的头文件,其中包含nginx / apache应该为用户提供的文件的文件路径。这样你就不必在Django中浪费资源来提供文件,但是你仍然可以获得验证请求的优势。这样做也有很多3rd party apps

最后,为了保护用户不要下载媒体文件,您可以通过限制媒体文件夹的某些部分来使用nginx(我想象一下apache):

location /media/protected {
  internal;
  alias /var/www/files;
}

在这种情况下,nginx将拒绝直接向/media/protected发送用户请求,并且只允许通过Django发送的X-Accel-Redirect标头提供这些文件。然后,你必须在Django中配置的是将文件存储在该路径中以使它们受到保护:

models.FileField(upload_to='protected/myfiles')