如何使用django过早拒绝请求?

时间:2015-07-11 09:25:16

标签: python django security httprequest django-middleware

我收到了很多spambot请求(请求将referrer作为垃圾网站)。 如何在中间件上使用process_request过早拒绝请求,以便django不响应特定引荐来源的请求?

2 个答案:

答案 0 :(得分:9)

如果请求的RejectSpambotRequestsMiddleware来自特定的引荐来源,您可以创建referer类来拒绝请求。

它应返回NoneHttpResponse对象。如果返回None,Django将继续处理此请求,执行任何其他process_request()中间件,然后执行process_view()中间件,最后执行相应的视图。通常,如果传入请求未通过中间件执行的检查,则会向用户发送403 Forbidden响应。

from django.http import HttpResponseForbidden    

class RejectSpambotRequestsMiddleware(object):  

    def process_request(self, request):  
        referer = request.META.get('HTTP_REFERER')
        if referer == 'spambot_site_referer':
            return HttpResponseForbidden() # reject the request and return 403 forbidden response

        return # return None in case of a valid request

然后将中间件添加到MIDDLEWARE_CLASSES文件中的settings.py

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    ...
    ...
    # your custom middleware here
    'my_project.middlewares.RejectSpambotRequestsMiddleware',
)

注意:此处,RejectSpambotRequestsMiddleware将在最后运行,因为Django按照MIDDLEWARE_CLASSES中自上而下定义的顺序应用中间件。您可以根据需要更改MIDDLEWARE_CLASSES的顺序。

答案 1 :(得分:0)

对@Rahul Gupta的答案进行了一些修改。 将引荐来源网址与黑名单进行比较。

class RejectSpambotRequestsMiddleware(object):

    def __init__(self, get_response):
        self.get_response = get_response
        self.blacklist = ['bot1.com', 'bot2.com']

    def __call__(self, request):  
        referer = request.META.get('HTTP_REFERER')
        response = self.get_response(request)

        if not referer:
            return response

        for bad in self.blacklist:
            if bad in referer:
                return HttpResponseForbidden()
        return response