我在一个项目中工作,没有用户身份验证和授权。基本上我在客户端调用ajax,它在django中执行一个视图并返回一个json。我如何验证此请求仅来自浏览器以及如何限制不是来自浏览器或任何手动脚本?
答案 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')装饰视图,以便正确缓存响应。
我更新我的答案以符合我们上面评论的内容
在您的观看中
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%防止这种情况,但有些事情你可以做:
is_ajax
方法,但这只是检查XMLHttpRequest标头(再次,易于欺骗)。