【问题标题】:Django and Ajax security concernDjango 和 Ajax 安全问题
【发布时间】:2012-07-10 18:19:29
【问题描述】:

我有这个“模型”

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. 我无法对上述视图返回的对象进行 json 化处理。所以我必须将视图返回的“消息”对象发送到 javascript。
  2. 将 python 对象传递给 javascript 而不在 django 端对对象进行 jsonfying 是否安全?如果不是,那么可能会出现什么问题?

那么,你对我的问题有什么想说的呢?

【问题讨论】:

    标签: jquery python ajax django


    【解决方案1】:

    为什么你不能 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。

    【讨论】:

    • 它说:TypeError: is not JSON serializable
    • 你也必须让用户成为一个字符串,只需做一个嵌套字典,就像这样:`info = {'user': {'name': 'rayne', 'last_name': .. ..}}
    • 好的,那么我必须采用与使用 ajax 填充更多帖子的相同技术。我在那里所做的是将帖子对象转换为仅包含字符串的字典,然后我将 jsonified dict 返回到 javascript。但是在这里我想通过使用 {{ message.status }} 等来利用模板的力量。所以,我想我不能这样做。
    猜你喜欢
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    相关资源
    最近更新 更多