2012-07-10 37 views
1

我有这个“模型”Django和Ajax的安全问题

class messages(models.Model): 
    status_choices = (
     (u'read',u'read'), 
     (u'unread',u'unread') 
     ) 
    user = models.ForeignKey(User) 
    message = models.TextField() 
    status = models.CharField(max_length=6,choices=status_choices,default='unread') 
    sender = models.ForeignKey(User,related_name="sender") 

这是我的看法,其获取用户信息,并将其传递给JavaScript。

@login_required 
def ajax_fetch_messages(request): 
    if request.is_ajax(): 
     print(request.POST['user']) 
     # first check that user himself asked for his/her messages 
     requested_user = get_object_or_404(User,id=request.POST['user']) 
     if requested_user == request.user: 
      # do processing of messages 
      user_messages = messages.objects.filter(user=requested_user,status='unread') 
      '''try: 
       response = dumps(messages) 
      except: 
       print("Unable to dump messages")''' 
      return HttpResponse(user_messages) 
     else: 
      return HttpResponse("You're not authorised to do that") 
    else: 
     return HttpResponse("This method can't be called this way") 

现在我有以下顾虑

  1. 我无法jsonify通过上述view.So我要送由视图的JavaScript返回“消息”对象返回的对象。
  2. 将python对象传递给javascript没有在Django结束对象时安全吗?如果不是,那么会出现什么问题?

那么,你有什么要说我的问题?

回答

2

为什么你不能jsonify你的对象?在发送对象的情况下(我怀疑你可以,除非有一些中间件处理转换),它会把它腌一下并以字符串的形式发送出去,所以无论如何你总是可以对任何对象进行jsonify。

例如,如果我想发送的所有信息来自一个名为“公司”的对象:

comp = Company.objects.all()[0] 
info = {"name": comp.name, "url": comp.url, "created_on": datetime.strftime(comp.created_on, "%d-%m-%Y")} 
return HttpResponse(json.dumps(info)) 

考虑到您发送一切都应该是一个字符串(或整数,将被自动转换以字符串)。

你在你的JavaScript中发送的JSON后,您只需要得到该对象,并对其进行分析:

obj = JSON.parse(response)

就是这样!现在关于安全问题,我想到的唯一问题是您发送的信息可能不会像对象ID一样使用,除此之外没有真正的安全风险。

现在,如果你想要的是发送一个渲染视图,以便您可以使用的模板,你可以这样做的动力:

from django.template import Context, loader 

context = Context({'user': UserObject, 'company': CompanyObject}) 
html_t = loader.get_template(HTML_TEMPLATE_PATH) 
html = html_t.render(context) 

return HttpResponse(html) 

现在在你的Ajax您将收到呈现模板,你可以使用权不需要任何json。

+0

它说: 类型错误:不是JSON序列化 – 2012-07-10 19:46:31

+0

你必须使用户的字符串也只是做一个嵌套的字典,就像这样:'信息= {“用户”:{“名”:“莱恩','last_name':....}} – Hassek 2012-07-10 19:51:24

+0

好吧,然后我不得不诉诸同样的技术,我用我的页面填充更多的帖子使用ajax.What我做的是我转换后的对象到一个字典包含只有字符串,然后我将json化的字典返回给javascript。 但在这里我想通过使用{{message.status}}等来利用模板的力量。所以,我想我不能那样做。 – 2012-07-10 19:59:37