【问题标题】:Using Django Rest Framework as security layer for file system processing使用 Django Rest Framework 作为文件系统处理的安全层
【发布时间】:2016-05-10 23:22:03
【问题描述】:

我正在尝试保护我的远程服务器文件系统免受未经授权的用户的攻击。 我在另一台服务器上有一个远程存储,用于存储和处理来自各种进程的 PDF 和 PNG。

我将 Python 2.7 与 Django 1.8 和 Django Rest Framework 一起使用。

我尝试实现非常基本的“代理层”,它可以让我控制谁使用文件系统。

这是我的view.py

from django.conf import settings

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import permissions

import requests

class Reports(APIView):
    permission_classes = (permissions.AllowAny,)  #Thats only for now...

    def get(self, request, ssn, validity, file):
        response = requests.get(settings.PROXY_BASE_URL + "/reports/" + ssn + "/" + validity + "/" + file)
        return Response(response)

此概念适用于任何其他 GET POST PUT DELETE 基于文本响应的请求(例如来自远程服务器的 json 响应)。

我的问题是当我调用这个视图时,我在浏览器中得到了默认的 REST 方法定义页面。

This is the response screenshot

【问题讨论】:

  • Gal,你能附上截图的链接吗?
  • 我在编辑中附上了,
  • 如果您将?format=json 附加到您的网址,有什么变化吗?
  • 附加 ?format=json 以文本形式返回图像。

标签: python django rest


【解决方案1】:

正如@AlexMorozov 在他的评论中所说,您应该回复HttpResponse。 你可以通过探索这个Django Snippet看到。

这是我看到的代码:

from django.conf import settings

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import permissions

from django.http import HttpResponse

import requests
import mimetypes


class Reports(APIView):
    permission_classes = (permissions.AllowAny,)

    def get(self, request, ssn, validity, file):
        response = requests.get(settings.PROXY_BASE_URL + "/reports/" + ssn + "/" + validity + "/" + file)
        mimetype = mimetypes.guess_type(settings.PROXY_BASE_URL + "/reports/" + ssn + "/" + validity + "/" + file) #Return an array
        return HttpResponse(response, content_type=mimetype[0])

试一试。祝你好运:)

【讨论】:

    【解决方案2】:

    问题是你不能简单地用 DRF Response 包装 requests 响应并完成它。将您的代码更改为:

    from django.core.servers.basehttp import FileWrapper
    
    upstream_response = requests.get(settings.PROXY_BASE_URL + "/reports/" + ssn + "/" + validity + "/" + file)
    response = Response(FileWrapper(upstream_response.content), content_type='YOUR_MIME_TYPE')
    response['Content-Disposition'] = 'attachment; filename="%s"' % 'your_filename.ext'
    return response
    

    顺便说一句,还有其他(更干净,IMO)方法来解决这个特定的任务。看看django-sendfile 应用程序。它将实际文件服务卸载到 nginx 或您选择的服务器,同时允许您检查权限和内容。

    【讨论】:

    • 我收到<wsgiref.util.FileWrapper instance at 0x0617F710> is not JSON serializable
    • 那么回退到普通的 Django HttpResponse 而不是 DRF 的 Response 可能会更好。试试看是否有帮助,不幸的是,我现在没有操场来测试它。
    猜你喜欢
    • 1970-01-01
    • 2020-07-14
    • 2020-06-11
    • 1970-01-01
    • 2019-02-20
    • 2020-06-10
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多