セッションの原則は、対応するセッションIDを持つユーザーだけがアクセスできるサーバー側にデータを保存することです。セッションの代わりにhmacベースのクライアントデータ検証を使用しますか?
データには、クライアントとの関係でプライベートまたはパブリックの2種類があります。セッションはもちろん、公共のアクセスのためにプライベートです。
私は通常、ユーザーIDといくつかのランダムなデータを格納しています(具体的な例はありません)。
私はセッションを全く使用しないことを考えています。代わりに、ユーザーが送信したデータの有効性をチェックする関数を使用します。サーバーには、ユーザーデータをハッシュするために使用するプライベートキーがあります。
たとえば、ユーザーがid = 9999を持つ場合、通常、ユーザーはセッションIDに関連付けられたファイルに格納します。クライアントがリクエストを行うたびに、セッションIDを確認し、それに関連付けられたセッションファイルからデータを取得します。
私はクライアント側でセッションデータを保存することを考えており、クライアントが要求を行うたびにこのデータとデータのハッシュを送信します。
ユーザーがログインすると、ユーザーは資格情報を送信し、サーバーはそのIDにタイムスタンプとユーザーIDと秘密キーに基づいて計算されたハッシュを返します。 今後のリクエストに対して、サーバーは同じ機能を使用し、結果のハッシュが同じ場合、セッションは有効であり、データは事前に検証されています。
セッションを置き換える有効な方法ですか? サーバープライベートセッションデータを保存しない以外に何か欠点がありますか?
私はスピードに関係だったと私は、私はノートPC(インテルデュオ)上でこれを実行しました
Script took 5.246542930603 seconds
を印刷し、小さなテスト...
<?php
$session = array(
'userId' => 999,
'timestamp' => time()
);
$privateKey = 'da39a3ee5e6b4b0d3255bfef95601890afd80709';
$startTime = microtime(true);
for ($i = 0; $i < 1000000; $i++){
$hash = hash_hmac('sha1', json_encode($session), $privateKey);
}
echo 'Script took ' . (microtime(true) - $startTime) . ' seconds';
を...作りました。 これは手頃な時間です(0.000005247 /ハッシュ)。 テストは正しいですか?
EDIT:セッションの有効期限を保証するために、タイムスタンプがユーザーIDとともにハッシュされます。サーバー側では、セッションが有効であっても、それが古すぎるとしても期限切れと見なすことができます。
プライベートキーを使用してタイムスタンプとともにデータをハッシュしているのであれば、実稼働環境で使用することができますか?私はいくつかの欠点を考えることができ
ViewStateとセッションを調べるのは興味深いかもしれません。 .Netに精通している方がより意味をなさないでしょうが、関連する原則は基本的にここで検討しているものと同じです。 –
チケット発行システムは、多くのデータをセッションに入れないで、セキュリティを維持し続ける典型的な方法です。私はほとんどの場合ウェブサイト用のチケット発行システムを実装し、チケットをセッション変数、CookieまたはURLパラメータに入れます。 –
Phoenix氏のように、ViewStateテクノロジーを探しています。私は以前に実装したことがあります。トリックは、後でurlencodeするシリアライズ可能なオブジェクトを作成するだけで、ユーザーはデータを簡単に読み取ることができず、urlencodedデータからハッシュを作成できるため、ViewStateがまだ有効かどうかを検証できますそれを使用する前に有効です... –