2011-02-04 10 views
10

私は現在、非常に忙しいインターネットのWebサイトのAPIを構築しています。 MySQLでPHPで書かれています。これは私の最初のAPIで、人々が自分のアカウントに遠隔からアクセスできるようにしています。 APIがオンラインになると、開発者は独自のツールを書くことができます。PHP/MYSQLで安全なパブリック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を持つ安全な方法であるかどうかはわかりません。

アイデアや提案は大変ありがたいです。

+0

パスワードのハッシュがURLにあることは良い考えではありません。より良い方法は、ユーザーとAPIの間に何らかの認証形式を呼び出すAPIキーを置くことです。 – diagonalbatman

+0

すべてのコメント、ありがとう、OAuth、私が必要なもののために少し複雑に思えるので、私は独自のAPIキーのセットアップを構築しています。私はauthキーがuser_idにリンクされているデータベースに格納されるところで働く何かを持っています。この設定は機能しますが、ユーザーはこのキーを取得する必要があります。他のユーザーがこのAPIからツールを作成する場合、ユーザーは登録したユーザー名/パスでログインできる必要があります。だから私は、ユーザー名とパスワードの両方を受け取ってリモートからAPIキーを生成することができる最初の$ _GET URLを取得する方法はまだ分かりません。 –

答えて

4

HMAC_SHA1とユーザーのパスワードを使用した署名リクエストはどうですか?たとえば、あなたのURL:http://domain.com/api.php?api_option=list&api_user_name=USERNAME&api_user_password=PASSWORD

は、タイムスタンプおよび/またはランダムな文字列(ナンス)を追加し、正規化された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

何サーバーは、署名を除いたすべてのオプションを取得してから、同じメソッドを使用して署名を生成し、それをクライアントが送信した署名と比較します。

+0

こんにちはアービン、応答に感謝します。私は一般的な考えを得るために始めている。あなたは次の設定にコメントしていただけますか? 1. webmasterは一意のwebmaster_api_key を使用するために登録します。2. $ _POSTリクエストは、 'username'、 'password'、 'webmaster_api_key'、 'timestamp'を含むhttps経由でのみapilogin.phpに送信できます。 3. apilogin.phpは$ base_string = "username + timestamp + webmaster_api_key"を実行します。 $ signature = hash_hmac( 'sha512'、$ base_string、$ password);ログインの詳細が有効な場合は$ signatureを返します。この$署名はセッションデータベースに記録され、user_idにリンクされています。 –

+0

また、セッションの有効期限を過ぎる方法について100%確信していません。私は、ユーザーが特定のシナリオで長年にわたってログインしたがっていると思う。また、ユーザーはさまざまなツールを使用してログインしたままにしておくことができます。これは、わずか1人のユーザーのためにさまざまなセッションがdbに格納されることを意味します。誰かがログアウトするのを離れて、セッションが期限切れになるのは何ですか? –

13

インターネットの愛のために、は、このをしないでください。 I あなたのAPI用にOAuthを実装する時間を置くことをお勧めします。お願いします。どうかしてください。

はこれを見てください:http://toys.lerdorf.com/archives/55-Writing-an-OAuth-Provider-Service.html

+0

本当にOAuthを使用する必要がありますか?私はそれが好きではありません...(私は上記の方法は良い/安全ではないことに同意しますが) – o1iver

+0

@ o1iver:OAuthはかなり普及しており、特にOPよりもはっきりと書かれているからです彼自身のセキュリティ実装を思い付くことは信頼できません。トークンベースの認可システムは、彼が現在やっているものより優れています。 –

+0

ok、私はトークンベースの認証についてあなたに同意します、私はOAuthが好きではありません:-) – o1iver

4

は、それがMD5でエンコードされている場合は特に、それがコード化されている場合でも、APIのクリアランスのためのパスワードを使用しないでください。さらに、ユーザー名も使用しません。ユーザーにキーを生成させます。誰かにユーザーのアカウントにアクセスするために知っておくべきことの50%を知っている人を与え、MD5にはそれを元に戻してパスワード一致を見つけることができるサイトがたくさんあります。開発者がセキュリティ上の目的のためにこれをさらに進化させることができるように、キーは確かに最良の方法です。常にセキュリティを考える。

関連する問題