当前位置: 首页 > 知识库问答 >
问题:

姜戈发布了来自柴堆工人CSRF·托肯对我的看法的请求

华甫
2023-03-14

我正在使用Pyres工作人员对用户在表单中输入的数据进行一些处理。它们的处理是通过我的表单上的视图完成的,我向该视图发出POST请求,其中包含数据,包括要处理的数据和用户的CSRF中间件令牌。我的问题是,这显然是不够的,因为Django仍然拒绝了我的请求,并禁止403。

相关代码:

表单处理程序:

def handler(request):
    if(request.method == "POST"):
        if(request.POST.__contains__("taskdata")):
            #valid post of the form
            taskdata = escape(request.POST.get("taskdata",""))
            t = TaskData(data=taskdata, time_added=timezone.now(), token=request.POST.get("csrfmiddlewaretoken",""))
            t.save()
            r = ResQ(server="127.0.0.1:6379")
            r.enqueue(TaskData, t.id)

            return HttpResponse(t.id)


        else:
            #invalid post of the form
            raise Http404
    else:
        raise Http404

比利斯工人工作:

    @staticmethod
    def perform(taskData_id):
        #Get the taskData from this id, test it for tasky stuff
        task_data = TaskData.objects.get(pk=taskData_id)

        post_data = [('id',task_data.id),('data',task_data.data), ('csrfmiddlewaretoken',task_data.token)]     # a sequence of two element tuples
        result = urllib2.urlopen('http://127.0.0.1:8000/tasks/nlp/process/', urllib.urlencode(post_data))
        content = result.read()
        return

该职务发布到的视图:

def process(request):
    if(request.method == "POST"):
        return HttpResponse("HEY, it works!")
        if(request.POST.__contains__("data") and request.POST.__contains__("id")):
            #valid post to the form by the model
            #taskdata = escape(request.POST.get("taskdata",""))
            #data = get_times(taskdata)
            return HttpResponse("Hey from process!")
            #return HttpResponse(json.dumps(data))

        else:
            #invalid post of the form
            raise Http404
    else:
        raise Http404

我基本上要做的是在表单提交时保存一些原始数据,以及CSRF令牌。然后工作人员将该数据令牌发送到处理视图。

不幸的是,发布令牌似乎还不够。

有人知道csrf保护实际上需要什么吗?我如何才能让我的Pyres员工遵守规定?

(建议标签:柴堆)

共有1个答案

陈野
2023-03-14

我想我看到了问题所在。

Django的CSRF保护的工作方式是生成一个nonce,然后将cookie设置为nonce的值,并确保csrfmiddlewaretokenPOST值与cookie的值匹配。其基本原理是它使其成为无状态系统,无需任何持久会话数据即可工作。

问题是你在Pyres工人工作中提出的要求...

result = urllib2.urlopen('http://127.0.0.1:8000/tasks/nlp/process/', 
                         urllib.urlencode(post_data))

…来自服务器,而不是客户端,因此它没有cookie集。

假设URL受到保护,只能由服务器访问,那么使process()视图免于CSRF检查可能是最简单的…

@csrf_exempt
def process(request):
   ...

...否则,您必须在< code>handler()视图中手动获取cookie值,并将其传递给Pyres worker作业。

更新

为了确保 process() 方法只能由服务器调用,一种简单的方法是使用类似...

@csrf_exempt
def process(request):
    if request.META['REMOTE_ADDR'] != '127.0.0.1':
        # Return some error response here.
        # 403 is traditional for access denied, but I prefer sending 404
        # so 'hackers' can't infer the existence of any 'hidden' URLs
        # from the response code
        raise Http404
    # Now do the thing
    ....

…尽管可能有一些内置的装饰器或其他东西可以为您完成此操作。

 类似资料:
  • 这是我的settings.py: 我已经验证了电子邮件地址,并生成了SMTP凭据,我下载了包含IAM用户名、Smtp用户名、Smtp密码的凭据。我使用smtp用户名EMAIL_HOST_USER和smtp密码EMAIL_HOST_PASSWORD。 在django中,我发送了一封带有以下行的电子邮件(admin@admin.com替换为已验证电子邮件列表中的gmail帐户): 那是行不通的。从SE

  • 在之前的程序中,我们直接生成一个字符串,作为http回复,返回给客户端。这一过程中使用了django.http.HttpResponse()。 在这样的一种回复生成过程中,我们实际上将数据和视图的格式混合了到上面的字符串中。看似方便,却为我们的管理带来困难。想像一个成熟的网站,其显示格式会有许多重复的地方。如果可以把数据和视图格式分离,就可以重复使用同一视图格式了。 Django中自带的模板系统,

  • 之前在单机上实现了一个Django服务器(被解放的姜戈07 马不停蹄),现在我们可以把这个服务器推上一个云平台。这里我选择使用阿里云。 看着复仇的火焰燃烧,姜戈露出得意的笑容。 阿里云准备 在阿里云官网(aliyun.com)页面注册阿里云账号。登录后选择云服务器ECS,并选择“创建实例”: 选择操作系统Ubuntu 14.04 64位,设置密码。实例开通后,可以在实例记录中查到它的IP地址,我以

  • 前面的文章研究了Django最主要的几个方面:数据库,模板,动态生成页面等。但都是使用python manage.py runserver来运行服务器。这是一个实验性的web服务器,不适用于正常的站点运行。我们需要一个可以稳定而持续的服务器。这个服务器负责监听http端口,将收到的请求交给Django处理,将Django的回复发还给客户端。 这样的持续性服务器可以有很多选择,比如apache, N

  • 之前了解了: 创建Django项目 数据库 模板 表格提交 admin管理页面 上面的功能模块允许我们做出一个具有互动性的站点,但无法验证用户的身份。我们这次了解用户验证部分。通过用户验证,我们可以根据用户的身份,提供不同的服务。 一个Web应用的用户验证是它的基本组成部分。我们在使用一个应用时,总是从“登录”开始,到“登出”结束。另一方面,用户验证又和网站安全、数据库安全息息相关。HTTP协议是

  • Django提供一个管理数据库的app,即django.contrib.admin。这是Django最方便的功能之一。通过该app,我们可以直接经由web页面,来管理我们的数据库。这一工具,主要是为网站管理人员使用。 这个app通常已经预装好,你可以在mysite/settings.py中的INSTALLED_APPS看到它。 “这庄园里的事情,都逃不过我的眼睛”,管家放下账本,洋洋得意。 默认界