13

Lithium(PHPフレームワーク)ベースのアプリケーションにログイントークンを実装する必要があります。2つの理由:

「rememberme」機能が欲しいです。

また、次のようにnode.jsソケットサーバーで認証されたユーザーを確認できるように、サーバーのログインを追跡する方法も必要です。

  1. ユーザーがページをリクエストする
  2. サーバーは、HTMLのどこかにセッショントークンを含むビューを返します
  3. クライアント側のJSはトークンを読み取り、それをnode.jsサーバーに送信して、Webソケットを介した接続を確立しようとします。
  4. サーバーは接続要求を受信し、PHPサーバーで送信されたトークンを確認します。
  5. 結果に基づいて接続を許可または拒否します。

したがって、これは2つの部分からなる質問です。このサイトのセキュリティは通常よりも優先されているため、私がばかではないことを確認するだけです。

これはログイントークンを作成するための合理的な方法ですか?

<?php
// String::hash() generates a sha512 (by default) hash. 
String::hash(time() . $user['username']);
?>

私が提案したWebソケット認証システムは正常ですか?発生している問題や、それを行うためのより効率的な方法を確認できますか?

4

3 に答える 3

6

まず、ログイントークンの生成方法を変更する必要があります。ユーザー名と連結された現在時刻のハッシュは、推測するのが難しいことではありません。これは安全であるために必要な条件です。これを行うには多くの方法がありますが、重要なのは、ランダム性の優れたソースを使用することです。あなたができること:

list(,$token) = unpack('H*', openssl_random_pseudo_bytes(15, $safe));
$safe or die("unsafe source");

使用している全体的な方法は、渡したベアラートークンが暗号化されずに送信されない場合にのみ安全です。つまり、送信するたびにSSL/TLSを介して送信する必要があります。

誤ってトークンを間違った場所に送信する可能性があるという問題がまだあります。そのため、宛先が何らかの方法で動的に生成される場合(たとえば、検出プロトコルを介して)は特に注意する必要があります。この問題を回避する唯一の方法は、暗号化を使用することです。

于 2011-07-04T11:08:40.250 に答える
5

RequestTokenLithiumのクラスを確認する必要があります:http: //li3.me/docs/lithium/security/validation/RequestToken :: check()#source

CSRF保護を処理し、上記と同様の原則に基づいて暗号的に安全なランダムトークンを使用しますが、bcryptによる保護の追加レイヤーがあり、任意の数の一意のハッシュに一致します。

于 2011-07-04T15:57:20.147 に答える
2

uniqid()関数を使用して一意のIDを生成し、セキュリティを強化してから、時間を削除するか、一緒に使用することができます。

<?php
String::hash(time() . uniqid() . $user['username']);
?>
于 2011-07-04T11:10:48.167 に答える