2012-03-13 2 views
0

Я хотел бы предоставить API для одного из моих приложений php. Как я могу предотвратить несанкционированный доступ к API? Пытался предоставить ключ API для каждого клиента, который зарегистрировался, но я думаю, что он может потерпеть неудачу при использовании с разными доменами. Какова идея проверки подписи или проверки ключа api. Пожалуйста, дайте мне несколько советовПодпись или проверка ключа API с помощью PHP

Заранее спасибо

+0

Возможный дубликат [Как обработать авторизацию API, написанную на PHP] (http://stackoverflow.com/questions/7830970/how-do-i-handle-authorization-to-an-api-written- in-php) – deceze

ответ

7

ключи API могут быть использованы для контроля скорости запроса, если они видны. Это означает, что вы не допустите больше N запросов в минуту за ключ за ip или что-то в этом роде. Они на самом деле не средство безопасности, а идентичность.

Теперь, как вы собираетесь убедиться, что этот ключ фактически используется пользователем, которому он принадлежит?

Один из способов сделать это подпись запроса. когда вы передаете запрос с кучей параметров (a = x & b = y ...), вы создаете подпись только для клиента, и сервер может создавать или проверять. это делается путем ввода параметров и значений и создания суммы MD5 или SHA1, добавляя в строку секретную переменную или соль. эта переменная никогда не отправляется на провод и видна пользователю только консолью администратора только по HTTPS. Однако не забудьте отсортировать параметры в алфавитном порядке перед хэшированием!

так, если мои параметры: foo=bar&bar=baz, я сортирую словарь параметров, добавьте секретный $SECRET='asd32efe32ef2df23' и создать: $sig = md5('bar=baz&foo=bar'.$SECRET); то можно просто добавить &sig={$sig} к запросу. другая сторона сделает то же самое с параметрами (исключая sig) и проверит его.

Хорошей идеей было бы изменить секрет за сеанс или каждый раз в то время. это можно сделать через HTTPS, используя пароль или сертификат SSL.

Редактировать: одна вещь, которую вы обычно добавляете, чтобы сделать ее более безопасной, представляет собой инкрементирующий идентификатор запроса, который также отправляется незашифрованным по проводу и используется в процессе хэширования. это предотвращает наличие двух одинаковых запросов от одной и той же сигнатуры и предотвращает повторную атаку (злоумышленник повторно передает команду). Когда вы это делаете, вам нужно разрешить некоторую грацию на сервере для запросов без заказов (т. Е. Клиент отправил их по заказу, но из-за скорости сети вы можете увидеть их как 100, 102, 101 на сервере).

+0

Подпись по существу точно такая же, как ключ API, и обеспечивает точно такую ​​же функциональность (подтверждение идентичности). Единственное различие заключается в том, что в подписанном запросе сам API-интерфейс никогда не отправляется по проводу, что сводит к минимуму вероятность его утечки в третью сторону. Это не меняет того факта, что это просто секретный, непрозрачный токен, который пользователь имеет, который однозначно идентифицирует его. – deceze

+0

Я считаю, что ключ API является открытым токеном, доступным для всех, поскольку вы не шифруете каждый вызов API нормально. API походит на ваше имя пользователя, и поскольку вы не можете передать пароль, вы передаете на его основе секрет, который является сигнатурой. –