Данное приложение реализует функциональность хранения массива пользователей и их любимых цитат
Пользователь может:
- Регистрироваться
- Входить в систему по никнейму и паролю
Зарегистрированный пользователь может:
- Получать никнеймы и любимые цитаты других пользователей
- Изменять свои никнейм и любимую цитату
-
auth/login
- осуществить вход пользователя в систему- Принимает в теле запроса:
username
- строка длинной от 4 до 32 символовpassword
- строка длинной от 8 до 64 символов
- Аутентификация: -
- Возвращает:
200 Ok
, данные о пользователе и токен в теле ответа, если пользователь существует и успешно вошел в систему404 Not Found
, если пользователя с таким именем не существует401 Unauthorized
, если пароль неверный
- Принимает в теле запроса:
-
auth/register
- зарегистрировать нового пользователя- Принимает в теле запроса:
username
- строка длинной от 4 до 32 символов, уникальное имя пользователяpassword
- строка длинной от 8 до 64 символов
- Аутентификация: -
- Возвращает:
201 Created
, данные о пользователе и токен в теле ответа, если пользователь успешно добавлен409 Conflict
, если пользователь с таким именем уже зарегистрирован
- Принимает в теле запроса:
-
api/data
- получить информацию о всех пользователях- Принимает в теле запроса: -
- Аутентификация: токен формата
Bearer eyJhbGciOiJSUzIA...
в заголовкеAuthorization
- Возвращает:
200 Ok
и список с информацией о всех пользователях401 Unauthorized
, если токен не передан, невалиден или просрочен
-
auth/update_user
- обновить информацию о пользователе- Принимает в теле запроса:
id
пользователя (собственный)username
- строка длинной от 4 до 32 символовfavoriteQuote
- строка или null
- Аутентификация: токен формата
Bearer eyJhbGciOiJSUzIA...
в заголовкеAuthorization
- Возвращает:
200 Ok
и обновленную информацию о пользователе401 Unauthorized
, если токен не передан, невалиден или просрочен403 Forbidden
, если переданный id не соответствует id полученному из токена404 Not Found
, если пользователь не найден409 Conflict
, если пользователь изменил имя, но с таким именем уже зарегистрирован другой пользователь
- Принимает в теле запроса:
Использование Spring Data JPA, который автоматически генерирует
запросы к базе данных исходя из имени метода.
Оно генерирует параметризованные запросы,
то есть вместо параметров в них подставлены знаки ?
.
Параметры же запроса передаются отдельно (не используя конкатенацию).
Это предотвращает исполнение пользовательского ввода как кода SQL.
public interface UserRepository extends CrudRepository<User, Long> {
User findUserByUsername(String username);
}
Использование кастомного JSON-сериализатора для всех возвращаемых строк.
В сериализаторе символы & < > " '
заменяются на их аналоги & < > " '
.
Таким образом, опасные (с точки зрения XSS) символы заменяются на их безопасные аналоги. Что помогает предотвратить возможную атаку.
public class EscapeJsonSerializer extends JsonSerializer<String> {
@Override
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(Encode.forHtml(value));
}
}
public class UserDTO {
@JsonSerialize(using = EscapeJsonSerializer.class)
private String favoriteQuote;
// other fields and methods...
}
Пример работы данной меры защиты:
-
При регистрации/входе пользователя ему выдается токен. Токен содержит информацию о пользователе - его уникальный id. Токен подписан секретным ключом, и имеет ограниченное время жизни. Токен используется при запросах к API для аутентификации пользователя (проверка подлинности токена и что он не истёк) и идентификации пользователя (т.е получения его id).
-
для всех защищенных эндпоинтов (
/api/**
) настроен доступ только при условии, что в запросе передан валидный непросроченный токен (см. SecurityConfig.java) -
Пароли хранятся в защищенном виде - закодированные алгоритмом bcrypt. Минимальная длинна пароля - 8 символов, что дает дополнительную защиту
Документ: spotbugs.html
Была найдена одна уязвимость. Но при проверке ./gradlew dependencies
./gradlew dependencies
...
spotbugs - configuration for the SpotBugs engine
\--- com.github.spotbugs:spotbugs:4.9.6
...
+--- org.apache.bcel:bcel:6.10.0
| \--- org.apache.commons:commons-lang3:3.14.0 -> 3.17.0
+--- com.github.stephenc.jcip:jcip-annotations:1.0-1
+--- org.dom4j:dom4j:2.2.0
+--- org.apache.commons:commons-lang3:3.18.0 -> 3.17.0
+--- org.apache.commons:commons-text:1.14.0
| \--- org.apache.commons:commons-lang3:3.18.0 -> 3.17.0
...
оказалось что эту зависимость подтягивает только
плагин com.github.spotbugs
, а эта значит уязвимость не
страшна во время выполнения программы.
Поэтому ничего с ней не делал.