2

предположим, есть сервис, который по get запросу на страницу /sms.php отправляет смс сообщение. Параметры сообщения передаются как get-параметры. но нужно ограничить доступ к этому api. вопрос - насколько безопасен и правилен будет подход, когда одним из get-параметров передается пароль (/sms.php?pass=12345), который знают нужные клиенты и сервер. на сервере же просто проверяем, равен ли $_GET['pass'] 12345...Или этот способ такого ограничения доступа к api уязвим? Какие еще есть варианты?

sam3434
  • 670

1 Answers1

8

Нет, это не правильно и не безопасно. Вот несколько соображений по поводу аутентификации запросов к API.

То, что идет по HTTP без шифрования по-определению не безопасно, поскольку подвержено атаке типа Man in the middle. Если злоумышленник реализует атаку этого типа, то ваш клиент рано или поздно потеряет свой пароль (токен, cookie, ...) для доступа к API. Единственный способ защиты (кроме шифрования): не передавать пароль по сети. Вообще. Существуют, например, методы оффлайн генерации одноразового токена/пароля при помощи физических устройств, хотя не думаю, что в вашем случае это применимо.

Из того, что я знаю, при отсутствии шифрования можно использовать только дайджест-аутентификацию, (Digest Authentication). Однако нужно понимать, что пароль (на основе которого подсчитывается контрольная сумма сообщения) должен быть передан клиенту по защищенному каналу. Кроме того, нужно предпринимать определенные шаги к защите от атак на повторение сообщений. Подробнее описывать не буду, тема довольно обширная.

Что касается передачи токена(пароля) через GET параметр, то это плохая идея даже если используется протокол HTTPS. С очень большой долей вероятности, все запросы к серверу логируются. Apache, например, по-умолчанию записывает в лог и все GET параметры. В принципе, логи должны надежно храниться на сервере, но я бы не стал надеяться, что никто не сможет получить к ним доступ. Все-таки логи охраняются с существенно меньшей паранойей чем доступы, например, к базе данных. По этому лучше (и идеологически правильнее) использовать POST запросы.

Если используется шифрование, то вы можете использовать один из следующих методов аутентификации:

  1. Передавать пароль/токен в теле POST запроса
  2. Использовать базовую аутентификацию (Basic Authentication)
  3. Дайджест-аутентификацию, (Digest Authentication)
  4. Сначала генерировать для пользователя временный токен, а уже потом использовать его для аутентификации
  5. Использовать cookie и механизм сессий (не очень в хорошо для API, но иногда удобно)

Список выше не претендует на полноту, но это самые очевидные и часто используемые варианты аутентификации.

Dmitriy Simushev
  • 17,999
  • 5
  • 49
  • 85