我向经过身份验证的用户提供敏感的用户名和密码文件。我希望用户通过模板中的file_url下载文件。
File_link = models.FileField(upload_to='SAFE_DIRECTORY_PATH')
我觉得把它存放在媒体目录中并不安全 任何保证他们安全的建议,网络应用程序都会生成链接。
答案 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')