Введение в практическую безопасность (2019)/Задания по вебу/Бонус по клиентской части
Баллы
За задание дается 300 баллов (сверх тех 1000 баллов, которые будут даваться за основные задания). Кроме этого, можно получить еще 70 баллов за экстра-часть (внизу формулировки).
Формулировка
Update: в формулировку добавлена экстра-часть, выполнение которой даёт еще баллов
Вам нужно добавить функциональность в веб-приложение из предыдущего задания, либо написать приложение с нуля. Разрешается брать за основу опубликованный код стендов по sql-уязвимостям, однако, доп. функциональность в рамках этого задания нужно реализовать самостоятельно.
В веб-приложении должны быть пользователи, у которых есть логины и пароли, должна быть возможность отобразить информацию о пользователе по его логину или id (/by-login
, /by-id
) - согласно формулировке предыдущего задания.
В рамках текущего задания в веб-приложении должно быть следующее:
- Логин. Должна быть страница с формой логина, куда можно ввести логин и пароль пользователя. В случае, если логин и пароль верны, должна создаваться сессия и происходить перенаправление на страницу пользователя. Иначе, пользователь должен снова получать форму логина, на которой должно быть сообщение, что пароль неверен, также поле с логином должно быть заполнено предыдущим введенным логином (чтобы пользователю не приходилось вводить его снова). Так должно происходить вне зависимости от того, существует такой пользователь или нет.
- Страница пользователя (если угодно, "личный кабинет"). Должна быть страница, где показываются все данные пользователя (id, login, money_amount, card_number, status). Пользователь попадает на эту страницу после логина. Если пользователь не залогинен, попытка зайти на эту страницу должна приводить к ошибке. Также на этой странице должна быть форма изменения своего номера карты и баланса. Т. е. должны быть два input, в которые можно ввести, соответственно, номер карты и сумму, а также кнопка, при нажатии на которую данные отправятся на сервер и поменяют то что написано про пользователя. При этом прямо во время ввода данных в поля страница должна проверять, правильные ли они и, если нет, рядом с полями ввода должна отображаться надпись что данные неверны, а кнопка отправки должна быть неактивна (т. е. должна внешне отличаться от обычного состояния и нажатие на неё не должно работать). Прямо во время ввода означает что данные перепроверяются после каждого добавления и удаления символа. Соответственно, если данные верны, кнопка должна стать активной, а надпись около полей ввода должна быть "OK". Проверка должна происходить на клиенте, для такой проверки на ходу нужно использовать JavaScript (учебник , википедия). Пример валидации формы на JS, для обработки ввода прямо по ходу ввода можно использовать событие input. Как должна делаться проверка:
- для суммы должно проверяться что это число, причем неотрицательное. Для номера кредитки должна делаться проверка Луна.
- пустые поля также не считаются верными. При этом кнопка должна быть неактивна, сообщение о неверно заполненных данных можно не указывать
- Сессии. В результате логина у пользователя должна создаваться сессия. В результате, если он перейдет на какую то другую страницу, а затем вернётся на свою страницу (из пункта 2), то ему должна снова успешно показаться страница с его данными. Попытка зайти на чужую страницу (если, скажем, у неё другой URL) должна приводить к ошибке. Как правило, сессии реализуются с помощью Cookie (википедия, MDN). Здесь про сессии на PHP, здесь - расширение для сессий на Flask, в целом, для других платформ то как сделать сессии гуглится.
- Логаут. Должна быть кнопка логаута, при нажатии на неё сессия пользователя завершается и дальше сайт для него должен работать так, будто он не логинился.
- Админка. Пользователь admin должен иметь особый статус. На его странице пользователя, кроме его данных, должно быть написано, что он админ, также должна быть форма сброса пароля. То есть форма с полями "логин" и "пароль" и кнопкой "сбросить", которая позволяет поменять пароль любому пользователю (включая себя самого)
Требования
- Как уже говорилось выше, попытка зайти на страницу пользователя не будучи залогиненым должна приводить к ошибке. Попытка отправить запрос на изменение номера карты и счета для незалогиненого пользователя также должна приводить к ошибке.
- Должен быть пользователь с логином
test
и паролемtest
. Также, должен быть пользователь с логиномBen O'Connor
. У него должна быть возможность залогиниться, его имя должно корректно отображаться - Cуммы на счете считаются секретными, они не должны показываться другим пользователям (в списке активных пользователей или на страницах
/by-login
и/by-id
). - При попытке открыть
/by-login
или/by-id
, если такого пользователя не существует, должна отдаваться страница с ошибкой, на которой должен быть указан id или login, который пользователь запросил. Т. е. должно быть сообщение вида "Пользователя с логином <ТУТ ЛОГИН КОТОРЫЙ БЫЛ ВВЕДЕН> не существует". - Usability:
- Для незалогиненого пользователя с главной страницы должна вести ссылка на страницу логина, либо форма должна быть прямо на главной.
- Соответственно, если пользователь залогинен, на главной должна быть ссылка на его страницу пользователя, либо главная страница должна быть его личной страницей.
- На странице пользователя должна быть кнопка логаута.
Экстра-часть
В дополнение к тому что описано в формулировке можно получить еще 70 баллов если немного доделать форму изменения своего баланса и номера счета в "Личном кабинете":
- в сообщении о том что введены неправильные данные должно быть указано само неправильное значение. Т.е., если введено
BADnfg43
то сообщение должно быть видаНеверный номер кредитной карты: BADnfg43
. Если данные валидные то указывать значение не обязательно, можно писать простоOK
например. - это сообщение о неправильных данных должно быть красного цвета
- инпуты этой формы должны быть изначально (при открытии страницы) заполнены старыми значениями
- проверка валидности значений инпутов должна проделываться автоматически при загрузке страницы - чтобы если в базе на момент открытия страницы уже невалидные данные (например, пользователь внёс их давно, до добавления проверок) это было сразу видно. Чтобы это протестить пусть у пользователя test изначально невалидный номер карты, какой-нибудь
ABCDEF
. Тогда при изначальном заходе в свой личный кабинет он должен увидеть это значение в поле для номера карты, а рядом с ним красную надпись типаНеверный номер кредитной карты: ABCDEF
.
Критерии
Update: дедлаин был продлён до 23.59 4 марта
Чтобы засчитать задание, вы должны прислать код своего мини-приложения (архивом или ссылкой на код) в телеграм @asterite3 или на мою почту: asterite@seclab.cs.msu.su. К коду должен прилагаться README, где есть список всех зависимостей (всего, что ваш код использует) и есть инструкция по установке/запуску. Я должен смочь запустить ваше приложение, и оно должно правильно работать, отвечая требованиям, иначе задание не будет засчитано. Крайний срок приема задания - 23.59 4 марта. Поскольку с первого раза что-нибудь обязательно не заработает, лучше присылайте пораньше, я напишу если возникнут проблемы чтобы можно было исправить. Автором присланного кода должны быть вы сами, запрещается присылать приложение, сделанное кем-то еще. В своем сообщении или теме письма не забудьте указать по какому поводу пишете (например "Задание по клиентской части веб-приложения по курсу Безопасность компьютерных систем" и ФИО).
Те кто пришлёт работающее и отвечающее критериям приложение первыми, получат дополнительный бонус. Также отдельный бонус получит приложение, которое выгядит приятнее всего - визуально, в плане внешнего вида - но при этом отвечает требованиям. Чтобы было интереснее, варианты дизаина, ставшие лучшими по внешнему виду в прошлый раз, в розыгрыше приза за внешний вид не участвуют (то что дизаин не тождественнен другому дизаину определяется субъективно проверяющим, как, собственно, и то какой дизаин более красивый).