В настоящее время я создаю API для очень загруженного интернет-сайта. Его написано на PHP с MySQL. Теперь это мой первый API, который я пишу, что позволяет людям получать доступ к своей учетной записи удаленно. После того, как API будет в сети, разработчики смогут писать из него свои собственные инструменты.
Теперь у меня работает API, но я не уверен, что он полностью безопасен.
Пример URL-адреса, который будет работать: http://domain.com/api.php?api_option=list&api_user_name=USERNAME&api_user_password=PASSWORD
USERNAME
: будет фактическое имя пользователя
PASSWORD
: будет закодированная строка MD5 их фактического пароля.
Если детали совпадают, результат возвращается, если нет, и ошибка.
Все внешние входы $_GET
получают обработку mysql_real_escape_string()
.
Я хотел, чтобы все было просто, но я не уверен, является ли этот способ безопасным способом публичного API, который напрямую вписывается в данные учетных записей пользователей.
Идеи и предложения очень ценятся.
Как насчет подписания запросов с использованием HMAC_SHA1 и пароля пользователя? Например, ваш URL: http://domain.com/api.php?api_option=list&api_user_name=USERNAME&api_user_password=PASSWORD
Добавьте метку времени и / или случайную строку (nonce) и создайте нормализованную base_string:
$base_string = "api_option=list&api_user_name=USERNAME×tamp=1296875073&nonce=hgg65JHFj"; $signature = hmac_sha1($base_string, PASSWORD);
то новый URL-адрес будет выглядеть следующим образом: http://domain.com/api.php?api_option=list&api_user_name=USERNAME×tamp=1296875073&nonce=hgg65JHFj&signature=kfvyhgfytgyr6576yfgu
То, что делает ваш сервер, – это получить все параметры, исключая подпись, а затем сгенерировать подпись с использованием того же метода и сравнить ее с сигнатурой, отправленной клиентом, которая должна быть одинаковой.
Пожалуйста, для любви к Интернету, НЕ ДЕЛАЙТЕ ЭТО . Я умоляю вас поставить время на внедрение OAuth для вашего API. Пожалуйста. Пожалуйста пожалуйста пожалуйста.
Взгляните на это: http://toys.lerdorf.com/archives/55-Writing-an-OAuth-Provider-Service.html
Не используйте пароль для зазора API, даже если он закодирован, особенно если он закодирован в MD5. Кроме того, я бы не использовал имя пользователя пользователя. Пусть пользователь сгенерирует ключ. Вы даете кому-то возможность узнать 50% того, что им нужно знать, чтобы получить доступ к учетной записи пользователя, а в MD5 есть много сайтов, которые вы можете отменить и найти совпадение пароля. Ключ, безусловно, лучший способ пойти так, чтобы разработчик мог восстановить его дальше по дороге в целях безопасности. Всегда думайте о безопасности.