相关疑难解决方法(0)

Django - 了解X-Sendfile

我一直在研究使用Django进行访问控制的文件下载.我的目标是完全阻止对文件的访问,除非由特定用户访问.我已经读过,当使用Django时,X-Sendfile是实现这一目标的首选方法之一(基于其他SO问题等).我对使用Xang Sendfile和Django的基本理解是:

  1. 用户请求URI以获取受保护的文件
  2. Django应用程序根据URL决定返回哪个文件,并检查用户权限等.
  3. Django应用程序返回HTTP响应,并将"X-Sendfile"标头设置为服务器的文件路径
  4. Web服务器找到该文件并将其返回给请求者(我假设Web服务器也沿途除去了'X-Sendfile'标题)

与直接从Django中删除文件相比,X-Sendfile似乎是一种更有效的方法来实现受保护的下载(因为我可以依赖Nginx来提供文件,而不是Django),但是给我留下两个问题:

  1. 我对X-Sendfile的解释至少是抽象的正确吗?
  2. 它是否真的安全,假设我没有提供正常的前端HTTP访问(例如http://www.example.com/downloads/secret-file.jpg)到文件存储的目录(即,不要不要把它保存在我的public_html目录中)?或者,精通技术的用户是否可以检查标题等,并以反向工程方式访问文件(然后分发)?
  3. 它在性能上是否真的有很大差异?我是否会通过直接从Django提供8b块150Mb文件的下载来使我的应用程序服务器陷入困境,或者这种类型是无问题的?我问的原因是因为如果两个版本接近相等,Django版本会更好,因为我有能力用Python做事,比如记录完成的下载次数,下载的带宽等.

提前致谢.

python django x-sendfile download protected-resource

30
推荐指数
1
解决办法
8765
查看次数

如何通过保护仅经过身份验证的用户可以看到的URL来使文件成为私有文件

我想知道是否有一种方法可以保护图像或文件在未经过身份验证时被隐藏.

假设我的网站中有一个图像,只有在该用户通过身份验证时才能看到该图像.但问题是我可以复制网址或在新标签中打开图片.

http://siteis.com/media/uploaded_files/1421499811_82_Chrysanthemum.jpg

而且,即使我没有通过身份验证,我也可以通过访问该网址来查看该特定图像.所以,我的问题是,如何保护文件,以便只有经过身份验证的用户才会看到?

更新:

视图:

def pictures(request, user_id):
    user = User.objects.get(id=user_id)
    all = user.photo_set.all()
    return render(request, 'pictures.html',{
        'pictures': all
    })
Run Code Online (Sandbox Code Playgroud)

楷模:

def get_upload_file_name(instance, filename):
    return "uploaded_files/%s_%s" %(str(time()).replace('.','_'), filename)

class Photo(models.Model):
    photo_privacy = models.CharField(max_length=1,choices=PRIVACY, default='F')
    user = models.ForeignKey(User)
    image = models.ImageField(upload_to=get_upload_file_name)
Run Code Online (Sandbox Code Playgroud)

设置:

if DEBUG:
    MEDIA_URL = '/media/'
    STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "myproject", "static", "static-only")
    MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), "myproject", "static", "media")
    STATICFILES_DIRS = (
    os.path.join(os.path.dirname(BASE_DIR), "myproject", "static", "static"),
    )
Run Code Online (Sandbox Code Playgroud)

更新:

模板:

{% if pictures %}
    {% for photo in pictures %}
        <img …
Run Code Online (Sandbox Code Playgroud)

python authentication django url file-access

10
推荐指数
1
解决办法
3028
查看次数