Введение в практическую безопасность (2019)/Задания по вебу/Бонус по клиентской части

Материал из SecSem Wiki
Перейти к навигации Перейти к поиску

Баллы

За задание дается 300 баллов (сверх тех 1000 баллов, которые будут даваться за основные задания). Кроме этого, можно получить еще 70 баллов за экстра-часть (внизу формулировки).

Формулировка

Update: в формулировку добавлена экстра-часть, выполнение которой даёт еще баллов

Вам нужно добавить функциональность в веб-приложение из предыдущего задания, либо написать приложение с нуля. Разрешается брать за основу опубликованный код стендов по sql-уязвимостям, однако, доп. функциональность в рамках этого задания нужно реализовать самостоятельно.

В веб-приложении должны быть пользователи, у которых есть логины и пароли, должна быть возможность отобразить информацию о пользователе по его логину или id (/by-login, /by-id) - согласно формулировке предыдущего задания. В рамках текущего задания в веб-приложении должно быть следующее:

  1. Логин. Должна быть страница с формой логина, куда можно ввести логин и пароль пользователя. В случае, если логин и пароль верны, должна создаваться сессия и происходить перенаправление на страницу пользователя. Иначе, пользователь должен снова получать форму логина, на которой должно быть сообщение, что пароль неверен, также поле с логином должно быть заполнено предыдущим введенным логином (чтобы пользователю не приходилось вводить его снова). Так должно происходить вне зависимости от того, существует такой пользователь или нет.
  2. Страница пользователя (если угодно, "личный кабинет"). Должна быть страница, где показываются все данные пользователя (id, login, money_amount, card_number, status). Пользователь попадает на эту страницу после логина. Если пользователь не залогинен, попытка зайти на эту страницу должна приводить к ошибке. Также на этой странице должна быть форма изменения своего номера карты и баланса. Т. е. должны быть два input, в которые можно ввести, соответственно, номер карты и сумму, а также кнопка, при нажатии на которую данные отправятся на сервер и поменяют то что написано про пользователя. При этом прямо во время ввода данных в поля страница должна проверять, правильные ли они и, если нет, рядом с полями ввода должна отображаться надпись что данные неверны, а кнопка отправки должна быть неактивна (т. е. должна внешне отличаться от обычного состояния и нажатие на неё не должно работать). Прямо во время ввода означает что данные перепроверяются после каждого добавления и удаления символа. Соответственно, если данные верны, кнопка должна стать активной, а надпись около полей ввода должна быть "OK". Проверка должна происходить на клиенте, для такой проверки на ходу нужно использовать JavaScript (учебник , википедия). Пример валидации формы на JS, для обработки ввода прямо по ходу ввода можно использовать событие input. Как должна делаться проверка:
    • для суммы должно проверяться что это число, причем неотрицательное. Для номера кредитки должна делаться проверка Луна.
    • пустые поля также не считаются верными. При этом кнопка должна быть неактивна, сообщение о неверно заполненных данных можно не указывать
  3. Сессии. В результате логина у пользователя должна создаваться сессия. В результате, если он перейдет на какую то другую страницу, а затем вернётся на свою страницу (из пункта 2), то ему должна снова успешно показаться страница с его данными. Попытка зайти на чужую страницу (если, скажем, у неё другой URL) должна приводить к ошибке. Как правило, сессии реализуются с помощью Cookie (википедия, MDN). Здесь про сессии на PHP, здесь - расширение для сессий на Flask, в целом, для других платформ то как сделать сессии гуглится.
  4. Логаут. Должна быть кнопка логаута, при нажатии на неё сессия пользователя завершается и дальше сайт для него должен работать так, будто он не логинился.
  5. Админка. Пользователь 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 марта. Поскольку с первого раза что-нибудь обязательно не заработает, лучше присылайте пораньше, я напишу если возникнут проблемы чтобы можно было исправить. Автором присланного кода должны быть вы сами, запрещается присылать приложение, сделанное кем-то еще. В своем сообщении или теме письма не забудьте указать по какому поводу пишете (например "Задание по клиентской части веб-приложения по курсу Безопасность компьютерных систем" и ФИО).

Те кто пришлёт работающее и отвечающее критериям приложение первыми, получат дополнительный бонус. Также отдельный бонус получит приложение, которое выгядит приятнее всего - визуально, в плане внешнего вида - но при этом отвечает требованиям. Чтобы было интереснее, варианты дизаина, ставшие лучшими по внешнему виду в прошлый раз, в розыгрыше приза за внешний вид не участвуют (то что дизаин не тождественнен другому дизаину определяется субъективно проверяющим, как, собственно, и то какой дизаин более красивый).