1

「file_get_contents」を次のように使用しています。

(以下のスクリプトは、たとえばhttps://siteA.com/checkifvalid.phpに投稿されています... URLがhttpSであることに注意してください)

<?php
//there is a login form on this URL and the entries put in the form are used to set the username & password variables below.
$username = "someusername";
$password = "somepassword";
$secretkey = "slkd89087235";

$yesorno = file_get_contents("httpS://siteB.com/checkdatabase.php?username=$username&password=$password&secretkey=$secretkey");

if ($yesorno == 'yes') {
//details are valid, so something 
} else {
//details aren't valid, display they aren't valid
}
?>

「checkdatabase.php」スクリプトは、_GETを使用してユーザー名とパスワードを取得し、URLから変数を取得してから、それらのログイン詳細を相互参照して、それらが有効かどうかを確認します。そうである場合は「はい」をエコーし​​、そうでない場合は「いいえ」をエコーし​​ます。

checkdatabase.phpスクリプトは、ユーザー名、パスワード、および秘密鍵のパラメーターの両方が渡された場合にのみ実行され、渡された秘密鍵の値がそのphpスクリプト内に格納されている秘密鍵と一致する場合にのみ実行されるように設定されています。

また、ユーザー/パスの組み合わせを推測する一種の「ブルートフォース」攻撃を防ぐために、特定の期間に「 http://siteA.com/checkifvalid.php 」を入力できる回数にも制限があります。

私の質問は、両方のURLがhttpSを使用しているため、上記の方法はどの程度安全であるかということです。

送信された値を暗号化する必要がありますか?それとも、上記の安全性はすでにありますか?

4

1 に答える 1

3

[更新]いくつかのコメントの後、私はあなたの質問を読んで答えるのが速すぎることに気づきました。気が変わった。

あなたの正確な質問に答えるために

HTTPSは秘密鍵と同じくらい安全です

攻撃者が秘密のSSLキーにアクセスできない限り、HTTPSは安全です。サーバーが危険にさらされた場合は、新しいキーを生成するまでHTTPSも危険にさらされます。

GETよりPOSTを優先する

次に、これに実際にHTTPを使用する場合は、GETではなくPOSTを使用する必要があります。

1)セマンティックな理由:他のサーバーに何かをするように要求しています。その操作はべき等ではありません、GETメソッドは(少なくとも理論的には)べき等です。@Gumboがコメントで指摘しているように、あなたはチェックを行っているだけで、宛先サーバーで操作を実行していないため、べき等に関するコメントはここには適用されません。

2)パスワードがアクセスログに表示される可能性があります。さまざまなスタックがデフォルトでさまざまな方法でHTTPSlogginを処理しているように見えますが、チャンスを逃さず、GETリクエストがどこかのログファイルに記録されると想定する必要があります。

cURLを使用して、次のようにPOSTを実行できます:PHP + curl、HTTP POSTサンプルコード?

プレーンテキストのパスワードを投稿/保存しないでください

暗号化されたパスワードの保存と投稿 マスターDBはプレーンテキストのパスワードを保存しないでください。代わりに、保存する前に暗号化してから、送信されたユーザー入力を暗号化してから比較してください。

共有公開鍵を使用する

プレーンテキストのusermame/password / secretを投稿する代わりに、共有キーを実装できます。これは基本的に、HTTPSで使用されるメカニズムと同じです。このメソッドを使用すると、HTTPを介してこのリクエストを安全に送信できます。

公開鍵暗号を読んでください、それは本当に理解しやすいです。を使用して実装しopenssl_public_encrypt()ます。

最後の1つについて詳しくは、openssl_public_encrypt()およびopenssl_private_encrypt()の出力をご覧ください。

さまざまなアプローチ

リモートDBを直接照会する

最も簡単な方法は、siteBでMysQLデーモンをセットアップして、siteAからのリモート接続のみを受け入れ、siteAから直接siteBDBにクエリを実行することです。これにはHTTPはまったく含まれません。MySQLパスワードが安全であることを確認し、IPで制限し、プレーンテキストのパスワードを保存しないでください。

OAUTHプロバイダーサービスを作成する

ウィキペディアから:

[OAUTH]は、エンドユーザーがユーザーエージェントリダイレクトを使用して、資格情報(通常はユーザー名とパスワードのペア)を共有せずにサーバーリソースへのサードパーティアクセスを承認するプロセスを提供します。

これが私があなた自身を書くことについて見つけた最初の記事です:http://toys.lerdorf.com/archives/55-Writing-an-OAuth-Provider-Service.html

Zend FrameworkのOAUTHコンポーネントのようなもの、またはそれがあなたがたどる道である場合は同様のものを使用する方が良いかもしれません。

于 2013-02-08T03:26:39.893 に答える