У меня есть мобильное приложение (в настоящее время IOS и вскоре Android), который рассказывает о веб-сервисе. Нет входа и данные не являются частными. В основном приложение POST устанавливает маркер (lon, lat) и GET содержит ближайшие 25 маркеров для отображения на карте.
Это очень тривиальное приложение, и я не могу представить, чтобы кто-то прилагал большие усилия для злоупотребления веб-сервисом. Тем не менее, я вижу, что для кого-то есть интерес для POSTing многих маркеров. Что меня больше всего беспокоит, так это то, что кто-то запускает script, который подталкивает многие запросы (используя дорогостоящую пропускную способность и делая бессмысленные данные моего приложения).
Я медленно делаю вывод, что это невозможно. Лучший ответ - "не делай этого". Не предоставляйте веб-службу без проверки подлинности. Не так много услуг открыты. API Google You Tube открыт, но большинство нет. К сожалению, у меня нет выбора. Поэтому после нескольких дней взгляда на это здесь мое мышление. Имейте в виду, что я очень далек от эксперта по безопасности, и я уверен, что мой подход может быть улучшен. Но это может указывать на вас в правильном направлении. Надеюсь, кто-то более опытный может перезвонить и исправить/улучшить это. Я нашел эту статью, и комментарии особенно полезны.
Безопасность уровня сообщений
Я буду защищать msgs с помощью хэш-шифрования. Клиенты и веб-сервис сохраняют копию общего секрета, который используется как соль для создания хеша из URL-адреса и всех аргументов POST. Хэш передается как дополнительный аргумент, а хэш перестраивается и сравнивается на другом конце (используя общий ключ в качестве соли). Это очень хорошо, пока вы не поймете, что любой мобильный клиентский код может быть запрограммирован в обратном порядке за считанные минуты. В этот момент эта линия обороны совершенно бесполезна.
Клиентские меры
Клиент включает ограничение скорости сообщений в качестве меры для ограничения количества сообщений, отправленных честными пользователями. И все же это бесполезно против злоумышленника, который джейлбрейк мобильного устройства.
Безопасность на стороне сервера
Таким образом, серверная сторона должна иметь как можно больше дополнительных мер безопасности, чтобы быть независимой, исходя из предположения, что ваш клиент (и общий секрет) скомпрометирован. Вот что я имею:
Один msg arg - это время UTC, которое используется для ограничения повторных атак. Это должно помешать злоумышленнику повторно запустить один и тот же msg на сервере.
Сервер выполняет ограничение скорости по IP. Да, IP-адреса легко подделываются, а переключение между прокси-серверами - игра для детей, но все помогает, когда у вас так мало.
Конечно, сервер строго проверяет все аргументы, использует параметризованные запросы и не возвращает исключения.
Безопасность транспортного уровня
К сожалению, я уверен, что выдача сертификатов отдельных клиентов SSL невозможна без регистрации. И поскольку я использую хэш-проверку msg (а мои данные не являются частными), я не совсем уверен, что SSL приносит в таблицу. Тем не менее, я, вероятно, буду использовать SSL (с одним сертификатом приложения), потому что он добавляет еще один уровень безопасности, который легко и дешево развертывается (хотя и за счет дополнительного времени соединения для каждого сообщения).
The Gaping Большая большая дыра в моем подходе
Я предупреждаю, что если приложение станет популярным, кто-то будет компрометировать общий секрет на клиенте. Просто потому, что они могут, и они, вероятно, опубликуют его в Интернете. Так что на самом деле все сводится к серверной стороне. К сожалению, у меня нет возможности идентифицировать и блокировать злоумышленника. Это я бы очень любил.
Заключительная просьба
После нескольких дней исследований это все, что у меня есть. Но я хочу большего. Я бы особенно признателен за любые идеи, направленные на усиление серверной части. Итак, я поставил все свои ТОЧНЫЕ ТОЧКИ как щедрость. Да, сэр, все 97 баллов!