如何在django中限制浏览器外部的ajax调用

时间:2016-01-26 05:42:11

标签: ajax django

我在一个项目中工作,没有用户身份验证和授权。基本上我在客户端调用ajax,它在django中执行一个视图并返回一个json。我如何验证此请求仅来自浏览器以及如何限制不是来自浏览器或任何手动脚本?

2 个答案:

答案 0 :(得分:1)

您可以使用 def food(zone, meat, snake): ''' Returns an (x, y) tuple if there is a location for a new apple available. Otherwise returns None ''' if len(meat) >= zone.height * zone.width - len(snake): return None x = random.randrange(0, zone.width) y = random.randrange(0, zone.height) position_free = True for rib in meat: if rib[0] == x and rib[1] == y: position_free = False for part in snake: if part[0] == x and part[1] == y: position_free = False if position_free and not zone.is_out_of_bounds(x, y): meat.append((x, y)) else: return food(zone, meat, snake) 方法

  

<强> HttpRequest.is_ajax()

     

如果请求是通过XMLHttpRequest发出的,则返回True,方法是检查字符串'XMLHttpRequest'的HTTP_X_REQUESTED_WITH标头。大多数现代JavaScript库都会发送此标头。如果你编写自己的XMLHttpRequest调用(在浏览器端),如果你想让is_ajax()工作,你必须手动设置这个头。

     

如果响应是否通过AJAX请求并且您正在使用某种形式的缓存(如Django的缓存中间件),则应使用vary_on_headers('HTTP_X_REQUESTED_WITH')装饰视图,以便正确缓存响应。

docs

我更新我的答案以符合我们上面评论的内容

在您的观看中

request.is_ajax()

在您的模板中

在这种情况下,我使用了元标记,但您明白了

from django.core import signing
from django.views.generic import View, TemplateView
from django.http import HttpResponseBadRequest

class BrowserView(TemplateView):
    template_name = 'yourtemplate.html'

    def get_context_data(self, **kwargs):
        ctx = super(BrowserView, self).get_context_data(**kwargs)
        ctx['token'] = signing.dumps(self.request.session_id)
        return ctx

class AjaxView(View):
    def get(self, *args, **kwargs):
        if self.request.is_ajax():
            try:
                sign = signing.loads(self.request.GET.get('token'), max_age=(20))
                if sign == self.request.session_id:
                    ## return ajax
                return HttpResponseBadRequest('You are not authorized to see this page')
            except signing.BadSignature:
                return HttpResponseBadRequest('You are not authorized to see this page')

        else:
            return HttpResponseBadRequest('You are not authorized to see this page')

在您的javascript中

<meta name="validation" content="{{token}}" />

答案 1 :(得分:0)

我不相信它可以100%防止这种情况,但有些事情你可以做:

  • 设置Cookie标头,页面上有一些唯一ID,但API响应没有。
  • 如果您的API未收到Cookie,请返回401。
  • 跟踪每个唯一ID的API调用可以很好地指示&#34;正确&#34;的使用。
  • 将ID与IP相关联。
  • 跟踪指标可以与阈值相结合,以便在超出时阻止请求。
  • 您可以查看引荐来源标题(易于欺骗)。
  • 最后,查找Django的is_ajax方法,但这只是检查XMLHttpRequest标头(再次,易于欺骗)。