#api #security #web-applications #owasp
Вопрос:
В моем веб-приложении у меня есть серверная часть, предоставляющая API, и интерфейсное приложение, которое их использует.
В соответствии со стандартом проверки безопасности приложений OWASP:
Приложение будет обрабатывать потоки бизнес-логики только в последовательном порядке шагов, при этом все шаги будут обрабатываться в реальном человеческом времени
Поскольку мы используем внутренние API-интерфейсы для отправки данных из внешнего приложения, как мы можем гарантировать, что они обрабатываются только в реальном человеческом времени?
Если это одно приложение, возможно, мы сможем проверить разницу во времени между отрисовкой и отправкой формы, так как мы используем API-интерфейсы, не зная, как это можно проверить.
Ответ №1:
Давайте предположим следующее. У нас есть трехэтапный процесс. Эти шаги заключаются в следующем:
- шаг 1
- шаг 2
- шаг 3
Мы хотим убедиться, что никто не запускает шаг 2 до шага 1 и что он не запускал шаг 2 через миллисекунды после выполнения шага 1.
Если мы в состоянии (потому что мы используем, например, сеанс сервера для хранения данных), то решение простое. Давайте сохраним в сеансе, что последним шагом, который сделал пользователь, был шаг 1, и включим метку времени. При выполнении шага 2 мы проверяем данные, сохраненные в предыдущем сеансе.
Если мы хотим быть без гражданства, то мы можем перенести информацию о том, что пользователь выполнил шаг 1 с некоторой отметкой времени, на клиент, но подписать ее с помощью некоторого кода аутентификации сообщения (MAC). Здесь мы столкнемся с очевидным недостатком, заключающимся в том, что пользователь может попытаться повторно использовать такие данные и сфабриковать множество вызовов шага 2, выполнив шаг 1 только один раз. Чтобы исправить это, нам нужно было бы углубиться и включить некоторые трудно угадываемые идентификаторы транзакций, которые мы также можем проверить. Это сделало бы все решение проблемы специфичным.