2012-07-10 34 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