Введение в практическую безопасность (2019)/Задания по вебу/Бонус по клиентской части: различия между версиями
Asterite (обсуждение | вклад) (→Формулировка) |
Asterite (обсуждение | вклад) (→Формулировка) |
||
Строка 14: | Строка 14: | ||
#* для суммы должно проверяться что это число, причем неотрицательное. Для номера кредитки должна делаться [https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D1%83%D0%BD%D0%B0 проверка Луна]. | #* для суммы должно проверяться что это число, причем неотрицательное. Для номера кредитки должна делаться [https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D1%83%D0%BD%D0%B0 проверка Луна]. | ||
#* пустые поля также не считаются верными. При этом кнопка должна быть неактивна, сообщение о неверно заполненных данных можно не указывать | #* пустые поля также не считаются верными. При этом кнопка должна быть неактивна, сообщение о неверно заполненных данных можно не указывать | ||
− | # '''Сессии'''. В результате логина у пользователя должна создаваться | + | # '''Сессии'''. В результате логина у пользователя должна создаваться '''сессия'''. В результате, если он перейдет на какую то другую страницу, а затем вернётся на свою страницу (из пункта 2), то ему должна снова успешно показаться страница с его данными. Попытка зайти на чужую страницу (если, скажем, у неё другой URL) должна приводить к ошибке. Как правило, сессии реализуются с помощью '''Cookie''' ([https://ru.wikipedia.org/wiki/Cookie википедия], [https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies MDN]). [http://php.net/manual/ru/session.examples.basic.php Здесь про сессии на PHP], [https://pythonhosted.org/Flask-Session/ здесь - расширение для сессий на Flask], в целом, для других платформ тот как сделать сессии гуглится. |
# '''Логаут'''. Должна быть кнопка логаута, при нажатии на неё сессия пользователя завершается и дальше сайт для него должен работать так, будто он не логинился. | # '''Логаут'''. Должна быть кнопка логаута, при нажатии на неё сессия пользователя завершается и дальше сайт для него должен работать так, будто он не логинился. | ||
# '''Админка'''. Пользователь admin должен иметь особый статус. На его странице пользователя, кроме его данных, должно быть написано, что он админ, также должна быть форма сброса пароля. То есть форма с полями "логин" и "пароль" и кнопкой "сбросить", которая позволяет поменять пароль любому пользователю (включая себя самого) | # '''Админка'''. Пользователь admin должен иметь особый статус. На его странице пользователя, кроме его данных, должно быть написано, что он админ, также должна быть форма сброса пароля. То есть форма с полями "логин" и "пароль" и кнопкой "сбросить", которая позволяет поменять пароль любому пользователю (включая себя самого) |
Версия 16:30, 1 марта 2019
Баллы
За задание дается 300 баллов (сверх тех 1000 баллов, которые будут даваться за основные задания).
Формулировка
Вам нужно добавить функциональность в веб-приложение из предыдущего задания, либо написать приложение с нуля. Разрешается брать за основу опубликованный код стендов по 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:
- Для незалогиненого пользователя с главной страницы должна вести ссылка на страницу логина, либо форма должна быть прямо на главной.
- Соответственно, если пользователь залогинен, на главной должна быть ссылка на его страницу пользователя, либо главная страница должна быть его личной страницей.
- На странице пользователя должна быть кнопка логаута.
Критерии
Чтобы засчитать задание, вы должны прислать код своего мини-приложения (архивом или ссылкой на код) в телеграм @asterite3 или на мою почту: asterite@seclab.cs.msu.su. К коду должен прилагаться README, где есть список всех зависимостей (всего, что ваш код использует) и есть инструкция по установке/запуску. Я должен смочь запустить ваше приложение, и оно должно правильно работать, отвечая требованиям, иначе задание не будет засчитано. Крайний срок приема задания - 23.45 4 марта. Поскольку с первого раза что-нибудь обязательно не заработает, лучше присылайте пораньше, я напишу если возникнут проблемы чтобы можно было исправить. Автором присланного кода должны быть вы сами, запрещается присылать приложение, сделанное кем-то еще. В своем сообщении или теме письма не забудьте указать по какому поводу пишете (например "Задание по клиентской части веб-приложения по курсу Безопасность компьютерных систем" и ФИО).
Те кто пришлёт работающее и отвечающее критериям приложение первыми, получат дополнительный бонус. Также отдельный бонус получит приложение, которое выгядит приятнее всего - визуально, в плане внешнего вида - но при этом отвечает требованиям. При этом решение, ставшее лучшим по внешнему виду в прошлый раз, в этот раз в розыгрыше приза за внешний вид не участвует.