Django: ответ ajax для действительного / доступного имени пользователя / адреса электронной почты при регистрации - PullRequest
2 голосов
/ 07 октября 2009

Я использую jQuery для проверки встроенной формы при регистрации пользователя, чтобы предотвратить ошибки формы после публикации, проверив:

  • Имя пользователя доступно
  • электронная почта еще не была зарегистрирована

Идея состоит в том, чтобы оставить отзыв пользователя перед отправкой формы, чтобы предотвратить разочарование. Код внизу.

Вопросы:

  • Это потенциальная проблема безопасности? У меня была мысль, что кто-то, глядя на мой javascript, может найти URL-адрес, который я запрашиваю, для подтверждения имени пользователя / электронной почты, а затем использовать его самостоятельно (я не знаю, почему они это сделали, но никто не знает).
  • Если это так, какую защиту я могу реализовать? Я немного читал о защите межсайтовых сценариев, но не уверен, как это можно реализовать в 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 ] * +1031 *

Ответы [ 2 ]

2 голосов
/ 08 октября 2009

См. http://www.djangosnippets.org/snippets/771/ - вы можете ограничить свой просмотр запросами ajax. Единственный способ сделать междоменный ajax - это jsonp , который вы не поддерживаете на ваш взгляд.

1 голос
/ 08 октября 2009

Да, это потенциальная проблема безопасности, но не слишком большая: просто убедитесь, что ваш код безопасен и всегда возвращает что-то, что не раскрывает информацию, которую следует скрыть.

Нет ничего плохого, если кто-то введет данные в браузере: example.com/account/verify_username/?username=admin (хотя я бы предложил использовать POST только здесь)

Итак, что нужно сделать: 1) Убедитесь, что все параметры вам нужны и они в правильном формате 2) Возможно, проверить, откуда поступил запрос 3) Убедитесь, что вы обрабатываете все исключения, которые могут произойти в коде 4) Не забывайте про модульное тестирование - для этого постарайтесь поместить свою логику НЕ в представление, а каким-то способом:)

...