Django:ajax响应注册期间有效/可用的用户名/电子邮件

时间:2009-10-07 12:16:24

标签: jquery ajax django django-forms django-views

我正在使用jQuery在用户注册期间进行一些内联​​表单验证,以通过检查是否在发布后防止表单错误:

  • 用户名可用
  • 电子邮件尚未注册

我们的想法是在提交表单之前向用户提供反馈,以防止受挫。代码位于底部。

问题:

  • 这是一个潜在的安全问题吗?我原以为有人看着我的javascript可以找到我正在查询用户名/电子邮件确认的网址,然后自己使用它(我不知道为什么他们会这样做,但是从来不知道)。
  • 如果是,我可以实施哪些保护措施?我已经阅读了一些关于跨站点脚本保护的内容,但我不确定它是如何在AJAX请求中实现的,例如,或者甚至是必要的。

感谢您的意见。

当前代码:

我已经定义了以下视图(我从一些片段中获取,但无法回想起在哪里):

def is_field_available(request):
    if request.method == "GET":
        get = request.GET.copy()
        if get.has_key('username'):
            name = get['username']
            if User.objects.filter(username__iexact=name) or \
                UserProfile.objects.filter(display_name__iexact=name):
                return HttpResponse(False)
            else:
                return HttpResponse(True)
        if get.has_key('email'):
            email = get['email']
            if User.objects.filter(email__iexact=email):
                return HttpResponse(False)
            else:
                return HttpResponse(True)

    return HttpResponseServerError("Requires username or email to test")

以下是jQuery代码示例:

$.get('is-user-name-available/', { email: $(this).val() },
    function(data, status){
        if(data == "True"){
            $input.fieldValid();
        } else {
            $input.fieldInvalid("This email address has already been registered.  Try another or recover your password.");
        }
});

编辑:更新了代码并重新解释了我的问题。 [ 10/07/09

2 个答案:

答案 0 :(得分:2)

请参阅http://www.djangosnippets.org/snippets/771/ - 您可以将视图限制为ajax请求。执行跨域ajax的唯一方法是jsonp,您在视图中不支持。

答案 1 :(得分:1)

是的,这是一个潜在的安全问题,但不是太大问题:只需确保您的代码是安全的,并且始终返回不会泄露应隐藏的信息的内容。

如果有人在浏览器中输入,那就没什么不好了: example.com/account/verify_username/?username=admin (虽然我建议只在这里使用POST)

那应该做些什么: 1)确认您需要的所有参数都是正确的格式 2)可能验证请求来自何处 3)确保处理代码中可能发生的所有异常 4)不要忘记单元测试 - 为此尝试将逻辑NOT放在视图中,但在某种方法中:)