Тестируем поля логин/пароль

Как и все собравшиеся в этом мониторе, мне приходится тестировать иногда проклятые поля ввода логина и пароля. И еще поля регистрации нового юзверя. По ходу дела и после поисков по интернетам собрался отдельный файлик с перечнем тематических тестов (еще будет дополняться и всячески обновляться). Полезен и в ратнейшем труде программистов.

Повсюду под предложением «Expected: alert» подразумевается, что ответ должен быть отрицательным, но система должна как-то сигнализировать юзеру о причине проблемы.

Регистрация нового пользователя

  1. Зарегистрировать нового пользователя с логином new_user. Expected: можно.
  2. Зарегистрировать нового пользователя с логином new_user_test. Expected: можно.
  3. Зарегистрировать нового пользователя с логином new-user. Expected: можно.
  4. Зарегистрировать нового пользователя с логином new1234user. Expected: можно.
  5. Зарегистрировать нового пользователя с логином new@user. Expected: alert.
  6. Зарегистрировать нового пользователя с логином newuser и паролем newuser (полное совпадение). Expected: alert.
  7. использование только ASCII символов в логине – Expected: alert.
  8. регистрация пользователя с логином, содержащим пробелы или состоящим из одних пробелом – Expected: alert.
  9. регистрация пользователя с паролем, содержащим пробелы или состоящим из одних пробелом – Expected: alert.
  10. регистрация пользователя с логином содержащим XSS или SQL injections. – Expected: alert.
  11. а можно ли зарегистрировать пользователя «admin», и пользователя «аdmin» (где а – из русской расскладки)?
  12. В некоторых случаях разработчики проверяют пользователя в базе с помощью LIKE, и не обрабатывают user input. Поэтому нужно проверить комбинацию %%%/%%% (знак % повторяется 3 раза, чтобы обойти валидацию на минимальную длину).
  13. Логин под существуюшим пользователем — смена пароля:
    1. Создать аккаунт с максимально возможным числом символом в логине
      1. Попробовать залогиниться
      2. Попробовать сменить пароль
      3. Причина: возможно несовпадение максимумов между строками ввода нового пароля, ввода пароля, смены пароля, и в БД.
        1. Дополнительно: проделать те же шаги, но с количеством символов макс+1
        2. Дополнительно: проделать те же шаги, но
          1. с макс. количеством разрешенных символов + пробел (и другие безобидные);
          2. с макс. количеством разрешенных символов + 1 запрещенный.
    2. Создать аккаунт с максимально возможным числом символом в пароле
      1. Попробовать залогиниться
      2. Попробовать сменить пароль (а может — и сам логин?)
      3. Причина та же: возможно несовпадение максимумов между строками ввода нового пароля, ввода пароля, смены пароля, и в БД.

Ввод некорректных данных

  1. Ввeсти корректный логин и корректный пароль. Expected: успешно залогинен. Разлогиниться. Почистить кэш и куки (открыть/закрыть браузер?).
  2. Оставить оба поля пустыми. Нажать на Login. Expected: alert.
  3. Оставить пустое поле login. Нажать на Login. Expected: alert.
  4. Оставить пустое поле password. Нажать на Login. Expected: alert.
  5. Ввeсти корректный логин и некорректный пароль. Expected: alert.
  6. Ввeсти некорректный логин, но корректный пароль. Expected: alert.
  7. Ввeсти некорректный логин и некорректный пароль. Expected: alert.
  8. В поле логина ввeсти корректный пароль, а в поле пароля ввести корректный логин. Expected: alert.
  9. Ввeсти логин <script>alert(123)</script> и корректный пароль. Expected: alert.
  10. Ввeсти в поле логина SQL запрос (‘ or ‘a’ = ‘a’; DROP TABLE user; SELECT * FROM blog WHERE code LIKE ‘a%’;)   — структура запроса зависит от DB.
  11. Ввeсти в поле логина скрипт (<script>alert(«Hello, world!»)</alert>, <script>document.getElementByID(«…»).disabled=true</script>)
  12. Ввeсти в поле логина html-теги (<form action=»http://live.hh.ru»><input type=»submit»></form>)
  13. Ввeсти в поле логина сложную последовательность символов вроде «♣☺♂» , «»‘~!@#$%^&*()?>,./\<][ /*<!—«», «${code}»;—>
  14. Ввeсти в поле логина текст состоящий из одних пробелов;
  15. Ввeсти в поле логина правильный логин, начинающийся с нескольких пробелов, и правильный пароль. Expected: alert.
  16. Ввeсти в поле логина правильный логин, после которого следуют нескольких пробелов, и правильный пароль. Expected: alert.
  17. Ввeсти корректный логин и корректный пароль. Нажать на кнопку «Назад» в браузере. Expected: непонятно — или The page should be expired, или увидеть те же поля. Если второе — ввести в поля снова логин и пароль. Перейти. Залогинен?
  18. Ввeсти корректный логин. Указать пароль с использованием букв РАЗНОГО регистра.
  19. Ввeсти логин с использованием букв РАЗНОГО регистра. Указать корректный пароль.
  20. Зарегистрировать пользователя с логином VasEA. Expected: можно. Попытаться залогиниться, используя в логине буквы только одного регистра (vasea). Expected: можно.
  21. Зарегистрировать пользователя с логином petea/iZMaIL. Expected: можно. Попытаться залогиниться, используя в пароле буквы только одного регистра (petea/izmail). Expected: alert. Алерт должен указать на причину?
  22. Проверить ограничение на длину логина и пароля при регистрации? Ввести  qqweqweqweqweqweqweqweqweqweqweqweqweqweqwe / qqweqweqweqweqweqweqweqweqweqweqweqweqweqwe
  23. Ввести логин/пароль Aa!@#$%^&*()-_+=`~/\,.?><|b / PaSSword!@#$%^&*()-_+=`~/\,.?><| Есть ли ограничения на допустимые символы?
  24. Ввести логин/пароль Иван/Болван Возможно ли создание имени/пароль с например кириллицей, если да — то как потом эта форма отрабатывает?
  25. Ввeсти логин ksjdksbdshdoueywfgjwevflwjeyfvowyecsydcvsldc (несуществующий в базе), оставить поле пароля пустым. Expected: such user doesn’t exist.
  26. Открыть первый бразуер. Залогиниться валидным юзером. Открыть второй браузер. Залогиниться тем же самым валидным юзером. Expected: можно. Разлогиниться в первом браузере. Expected: можно. Перейти во второй браузер. Сделать что-нибудь, что может сделать только залогиненный юзер. Expected: можно.
  27. Открыть браузер. Ввести в поля валидные данные. Нажать на кнопку Login. Отключить интернет. Получить «страница недоступна». Подключить интернет обратно. Зайти на сайт. Expected: не залогинен.
  28. Блокируется ли акаунт/IP того, кто введет n-количество раз не правильный пароль?
  29. Установить фокус на поле логина. Ввести текст. Нажать кнопку Tab на клавиатуре. Expected: фокус перемещается на поле пароля. Ввести текст. Нажать кнопку Tab на клавиатуре. Expected: фокус перемещается на галочку «remember me». Нажать кнопку Space на клавиатуре. Expected: появилась галочка. Нажать кнопку Tab на клавиатуре. Expected: фокус перемещается на кнопку Login. Нажать кнопку Enter на клавиатуре. Expected: процесс пошёл.
  30. User should be a registered user with his/her account expired.    Clicks on the Login button.
  31. A message should appear stating ‘Your account has been expired’.
  32. Проверка на ‘Remember me on this computer’. Заполнить поля валидными данными. Чекнуть галочку Remember me. Залогиниться. Закрыть браузер. Открыть бразуер. Открыть страницу сайта. Expected: логин для входа не требуется.
  33. Ввести логин существующего пользователя, обрамив его уголками: <userlogin>. Причина: иногда валидатор вырезает запрещенные символы и проверяет остаток, однако после прохождения проверки передает дальше оригинальную строку.

Смена/удаление логинов

  1. В базе или настройках сайта указать, что срок годности определенного логина истек. Залогиниться под этим логином. Expected: Alert.
  2. Залогиниться под корректными логином/паролем. Сменить пароль. Залогиниться под новым паролем. Expected: пароль сменен, можно зайти.
  3. Смена пароля и заход под старым
    1. запомнить пароль
    2. войти в систему
    3. поменять пароль
    4. разлогиниться
    5. залогиниться обратно со старым паролем. Expected: не пускает.
  4. Залогиниться под корректными логином/паролем. Переименовать аккаунт. Перегрузить браузер. Залогиниться под старыми логином/паролем. Expected: не пускает. Залогиниться под новым логином/паролем. Expected: пускает.
  5. Залогиниться под корректными логином/паролем. Удалить аккаунт. Перегрузить браузер. Залогиниться под старыми логином/паролем. Expected: не пускает.

Особые случаи

  1. Ввeсти корректный логин и корректный пароль. Скопировать полученный url и вставить его в другой браузер. Expected: It should not display the user’s welcome page.
  2. Подумать об обработке операции «вставить», т.е. рассмотреть различные способы ввода данных.
  3. Как формируется запрос к серверу с данной формы (get/post)? Как передается пароль — в виде хэша или плэйн-текстом в теле ПОСТа?
  4. Если данные передаются в адресной строке браузера в виде «login=bla-bla&password=bla-bla»
    1. — применить все варианты некорректных данных, включая запрещенные символы, и пограничные значения;
    2. — передать ещё какой-нибудь параметр из существующих, напр. «login=bla-bla&password=bla-bla&state=update»

56 ответов на “Тестируем поля логин/пароль”

  1. # Ввeсти в поле логина SQL запрос ( DROP TABLE user; SELECT * FROM blog WHERE code LIKE ‘a%’;);
    — не сработает.

    • Не сработает, если по-тупому вставить as is, или даже если правильно указать названия таблиц?

    • Надо сначала завершить без ошибки выполнение первого селекта выполняемого на сервере— > потом вставить свой —> потом закометировать остаток строки. Пример :
      ‘ or ‘a’ = ‘a’; DROP TABLE user; SELECT * FROM blog WHERE code LIKE ‘a%’; —
      структура запроса зависит от DB.

    • Сначала нужно определить поддерживает ли DB драйвер sql multi queries.

  2. Еще один catch…
    Иногда запись вида alert(‘truba’) может пройти успешно, поэтому предлагаю заэскейпить символы ><.
    После чего скрипт будет таким:
    <script>alert('truba')</script>
    Очень часто проходит и есть шанс поймать багу за хвост…

  3. Еще для регистрации нового пользователя можно добавить:
    8. использование только ASCII символов в логине — Expected: alert.
    9. регистрация пользователя с логином, содержащим пробелы или состоящим из одних пробелом — Expected: alert.
    10. регистрация пользователя с паролем, содержащим пробелы или состоящим из одних пробелом — Expected: alert.
    11. регистрация пользователя с логином содержащим XSS или SQL injections. — Expected: alert.
    список не полный, но это то, что пришло в голову сходу…

    • только надо указать каких именно символов
      0–31 Коды управляющих символов [возвраты каретки, сигнал и прочее]
      65-90 строчные латинские символы [ABCD и.т.д.]
      а то создается впечатление что Login123 у Вас будет не правильный, хотя наверняка имелось ввиду, что надо только чтобы у вас были НЕ допустимы отличные от A-Z, a-z, 0-9, -,_
      P.S. Подвох в слове символ вероятно, буквы и цифры тоже символы обозначающие что-то)

  4. Сомнения по поводу пункта 20:
    >Попытаться залогиниться, используя в логине буквы только одного регистра (vasea). Expected: можно.
    Можно ли? Думаю, и логин и пароль обязаны быть case-sensitive.

    • Омгм… Правильные сомнения, но в платформе, с которой я сейчас работаю, это можно — сделали специально, чтобы имена были уникальными, а то был конфликт между владельцем ника Imperator и владельцем ника ImperatoR 🙂
      Вот пароль должен быть сенситив, несомненно.

  5. Странно, один из моих постов с тест кейсами потерялся 🙂
    пробую еще раз:
    Иногда логин вида alert(123) будет заблокирован системой, в этом случае я предлагаю заэскейпить символы >< и попробовать следующий логин:
    <script>alert(123)</script>

  6. 🙂 интересно 🙂 в предыдущем посте я хотел написать:
    Символ замените на > («& g t ;» — пробелы убрать)
    Вот… 🙂

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

  7. Ого .. сколько проверок и правил! 🙂 Тут тестить и тестить, а если меняется что-то в коде, по новому нужно тестить.
    Мне кажется, что проще быть уверенным в правильной валидации данных своего фреймворка, нежели тестировать всеми способами.
    Например, в Yii я пишу так:
    public function rules()
    {
    return array(
    // username are required
    array(‘user_login, user_email’, ‘required’),
    // username must be between 6 and 30 characters
    array(‘user_login’, ‘length’, ‘min’=>6, ‘max’=>30),
    array(‘user_email’, ’email’),
    // verifyCode needs to be entered correctly
    array(‘verifyCode’, ‘captcha’, ‘allowEmpty’ => !extension_loaded(‘gd’)),
    );
    }
    Хотя тестирование всегда будет и до идеала его довести очень тяжело.

    • Ну, я вижу в твоем коде только проверки:
      — что обязательно заполнение двух полей
      — что мин 6 и мак 30 символов в поле логина
      — что в поле user_email должно находиться что-то, похожее только на емайл
      — что ты подозреваешь роботов в каждом юзере 🙂
      Все остальное непокрыто, и лично мне неясно, чего можно ожидать от этих милых, пушистых, но безумно неожиданных юзверей…
      Идеал и не нужен, иначе тестировщики потеряют право отмазываться «Всего не перетестишь!» Нужно из списка выцыганить самое важное «для себя» и проверить.

    • В этом то и суть тестирования, что оно идет независимо от тестирования разработчиков…

  8. Ну да, соглашусь! Я еще не подключил правило для допустимых символов в логине. Это будет обязательно, иначе внесут всякую дрянь.
    Кроме этого, нужен фильтр цензурных слов.

  9. а можно ли зарегистрировать пользователя:
    admin
    и пользователя
    аdmin (где а — из русской расскладки)
    ?

  10. есть такие умные разработчики, которые проверяют пользователя в базе с помощью LIKE и не обрабатывают user input, поэтому нужно проверить комбинацию %%%/%%% (знак % повторяется 3 раза, чтобы обойти валидацию на минимальную длину).

  11. Добрый день! Помогите мне пожалуйста. У меня при вводе на латинском видимо поставлен блокирующий режим перевода латиницы на русский алфивит, и пароль тоже. Как только начинаю в латинице набирать логин, он перескакивает на русский, соответственно вход на сайт блокируется.
    что мне сделать чтобы отменить это?

    • Ирина, в этом случае есть парочка вариантов обойти проблему, первый простой второй с веселый 🙂
      1. Удалите программу перевода латиницы на русский!
      2. Наберите по 1 символу (написали, скопировали и вставили) в блокноте Ваш логин и потом пароль. а потом просто копипастите его в форму логина 🙂
      Первый вариант мне нравится больше 🙂
      Вот…

  12. Отличная статья!!! огромное спасибо, уже применяю на практике некоторые кейсы…
    Не совсем согласен с п. 15-16 — как правило встречал приложения, где пробелы перед после логина — обрезаются и юзер логинится (e.g. gmail.com)
    Алексей, если будет возможность, прокомментируйте плиз. Заранее СПАСИБО!

    • Цель была такая: собрать любые мелочи, которые могут иметь отношение к тестированию полей ввода, и в частности — логин/пароль.
      Незачем использовать весь этот список «as is».
      Из него нужно выписать то, что подходит для каждого частного случая.
      Случай с пробелами, которые обрезаются — это хорошо, если обрезаются. У меня были случаи, когда это не обрезалось. Хорошо знать заранее, что и как работает 🙂 Обычно же знаешь, что и как ДОЛЖНО работать, не более.
      К слову, этот список по-разному воспринимается тестировщиками и программистами.
      — Тестировщики смотрят на это внимательно и сурово. Просто список проверок.
      — Программисты смотрят на это с возгласом «Ну ни фига себе, сколько всякого наворотили!»

  13. В разделы
    Регистрация нового пользователя, логин существующим пользователем
    Ввод некорректных данных
    Ввести логин <newuser>
    Причина: иногда валидатор вырезает запрещенные символы и проверяет остаток, однако после прохождения проверки передает дальше оригинальную строку.
    ******
    В разделы
    Регистрация нового пользователя, логин существуюшим пользователем, смена пароля
    Ввод некорректных данных
    Создать логин с максимально возможным числом символом
    Попробовать залогиниться
    Попробовать сменить пароль
    Причина: возможно несовпадение максимумов между строками ввода нового пароля, ввода пароля, смены пароля, и в БД.
    Дополнительно: проделать те же шаги, но с количеством символов макс+1
    Дополнительно: проделать те же шаги (за исключением смены пароля) для логина
    Дополнительно: проделать те же шаги для логина и пароля, но (1) с макс. количеством разрешенных символов + пробел (и другие безобидные);(2) с макс. количеством разрешенных символов + 1 запрещенный.
    ******
    В разделы
    Особые случаи
    Ввод некорректных данных
    Если данные передаются в адресной строке браузера в виде «login=bla-bla&password=bla-bla»
    — применить все варианты некорректных данных, включая запрещенные символы, и пограничные значения;
    — передать еше какой-нибудь параметр из существующих, напр. «login=bla-bla&password=bla-bla&state=update»

  14. тогда уже и статью пора переименовывать) давно уже вышла за рамки банального тестирования полей логин/пароль и разлилась по широкому полю функционала)))

  15. как насчет логина с непечатными символами форматирования текста (перевод строки, табуляция и т.п… )? до логина, после, до и после. в принципе и для регистрации тоже вполне применимо.

  16. добрый день, я только начинаю тестить и сразу же попала на ваш доклад про IDE, а потом и сюда.
    вопрос по «17. Ввeсти корректный логин и корректный пароль. Нажать на кнопку “Назад” в браузере. Expected: непонятно – или The page should be expired, или увидеть те же поля. Если второе – ввести в поля снова логин и пароль. Перейти. Залогинен?»
    я должна ввести данные, нажать логин, а потом нажать «Назад»? и то что пользователь два раза логинится это хорошо или все таки не очень?

    • и вот здесь наверно пароль имелось ввиду вместо логина?
      «Зарегистрировать пользователя с логином petea/iZMaIL. Expected: можно. Попытаться залогиниться, используя в пароле буквы только одного регистра (petea/izmail). Expected: alert. Алерт должен указать на причину?»?

    • это не хорошо и не плохо — это бывает.
      Плохо или хорошо — зависит от реализации каждой системы в отдельности.
      Иногда все выглядит так, словно юзер повторно логинится. Иногда нет.

  17. «Установить фокус на поле логина. Ввести текст. Нажать кнопку Tab на клавиатуре. Expected: фокус перемещается на поле пароля. Ввести текст. Нажать кнопку Tab на клавиатуре. Expected: фокус перемещается на галочку “remember me”. Нажать кнопку Space на клавиатуре. Expected: появилась галочка. Нажать кнопку Tab на клавиатуре. Expected: фокус перемещается на кнопку Login. Нажать кнопку Enter на клавиатуре. Expected: процесс пошёл. »
    А что если в «Crome» все работает а в «FireFox» нет. Это проблема браузера или кода.
    Спасибо.

  18. Полезная стаття — люблю когда всё собранно в одном месте и структурированно. Раздел «Особые случаи» — еще бы расширить и описать поподробней. Готов автору поставить вкусную выпивку 🙂
    ЗАМЕЧАНИЕ 0.
    Рекомендую потратить несколько минут. Забросить текст в Word и проверить хотя бы по минимуму орфографию. Как ни как если текст раскрутится, то его могут читать пол НСГ (из числа заинтересованных) .
    ЗАМЕЧАНИЕ 1. К разделу «Регистрация нового пользователя», п.8 – п.9.
    8. регистрация пользователя с логином, содержащим пробелы или состоящим из одних пробелом – Expected: alert.
    9. регистрация пользователя с паролем, содержащим пробелы или состоящим из одних пробелом – Expected: alert.
    — 2 пункта идентичны
    — «пробелом» заменить на «пробелов» (2 замены)
    ЗАМЕЧАНИЕ 2. К разделу «Регистрация нового пользователя», п.11.
    русской расскладки
    — «расСкладки» заменить на «раскладки»
    ЗАМЕЧАНИЕ 3. К разделу «Регистрация нового пользователя», п.13.
    Логин под существуюшим
    — «существуюШим» заменить на «существуюЩим»
    ЗАМЕЧАНИЕ 4. К разделу «Особые случаи», п.4.2.
    передать еше какой-нибудь
    — «еше» заменить на «еЩе»

  19. Спасибо за статью. Есть ли такого рода статьи для других функциональностей?

  20. Объясните пожалуйста почему Expected: alert на
    Зарегистрировать нового пользователя с логином new@user. ?
    Чем мешает @ в логине?

  21. Здравствуйте, подскажите техническую деталь — какой пароль будут корректным для этих кейсов?
    «6. Ввeсти некорректный логин, но корректный пароль. Expected: alert.
    7. Ввeсти некорректный логин и некорректный пароль. Expected: alert.»
    Разве некорректность логина не подразумевает, что — все, логина нет, пароль уже неважен? Спасибо!

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

  22. Возможно тут опечатка: «Создать аккаунт с максимально возможным числом символом в [u]логине[/u]» и вместо «логине» должно быть «пароле», исходя из контекста: «Попробовать залогиниться
    Попробовать сменить пароль
    Причина: возможно несовпадение максимумов между строками ввода нового пароля, ввода пароля, смены пароля, и в БД.» или я ошибаюсь?

  23. Expected: such user doesn’t exist. — Не правильно с точки зрения безопасности разделять правильность пароля и имейла. По крайней мере согласно OWASP система не должна уведомлять о том, что такого пользователя не существует

Добавить комментарий для Maxim Wolonter Отменить ответ