Создание безопасного публичного API с помощью PHP / MYSQL

В настоящее время я создаю 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&timestamp=1296875073&nonce=hgg65JHFj"; $signature = hmac_sha1($base_string, PASSWORD); 

то новый URL-адрес будет выглядеть следующим образом: http://domain.com/api.php?api_option=list&api_user_name=USERNAME&timestamp=1296875073&nonce=hgg65JHFj&signature=kfvyhgfytgyr6576yfgu

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

Пожалуйста, для любви к Интернету, НЕ ДЕЛАЙТЕ ЭТО . Я умоляю вас поставить время на внедрение OAuth для вашего API. Пожалуйста. Пожалуйста пожалуйста пожалуйста.

Взгляните на это: http://toys.lerdorf.com/archives/55-Writing-an-OAuth-Provider-Service.html

Не используйте пароль для зазора API, даже если он закодирован, особенно если он закодирован в MD5. Кроме того, я бы не использовал имя пользователя пользователя. Пусть пользователь сгенерирует ключ. Вы даете кому-то возможность узнать 50% того, что им нужно знать, чтобы получить доступ к учетной записи пользователя, а в MD5 есть много сайтов, которые вы можете отменить и найти совпадение пароля. Ключ, безусловно, лучший способ пойти так, чтобы разработчик мог восстановить его дальше по дороге в целях безопасности. Всегда думайте о безопасности.