【问题标题】:How do I reject a request prematurely with django?如何使用 django 过早拒绝请求?
【发布时间】:2015-09-30 01:51:11
【问题描述】:

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

【问题讨论】:

  • 我认为更好的选择是在 webserver level 处阻止此类请求
  • 如果请求到达 Django,它将占用资源。我不确定这是否是您的主要关注点,或者您网站上的垃圾邮件是否是,但最好使用防火墙或根据某些规则丢弃传入请求的东西,以防止它占用可以在其他地方使用的宝贵资源。
  • 附带问题:此类垃圾邮件机器人请求的目的是什么?他们认为他们会完成什么?
  • 我同意@Pynchia 的观点,尽可能早地做到这一点是最有效的,即在代理或网络服务器级别,甚至在它到达 Django 之前...... Django 中间件在请求处理管道
  • @knbk 没错。会考虑的。

标签: python django security httprequest django-middleware


【解决方案1】:

您可以创建一个 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

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

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

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

【讨论】:

    【解决方案2】:

    对@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
    

    【讨论】:

      猜你喜欢
      • 2020-04-15
      • 2013-06-28
      • 2014-08-10
      • 1970-01-01
      • 2015-07-26
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      相关资源
      最近更新 更多