2012-01-17 8 views
0

以前は、md5に保存されたパスワードと、$userId_$md5passwordのクッキーを使用して、ログインしたユーザーを検証していました...これはセキュリティが非常に悪いので、それ。カスタム '安全な' phpとMySQLユーザーログインセッションシステム

システムはVPSなので、誰もセッション変数、データベース、またはファイルシステムにアクセスすることはできないと思います。ログインページと登録ページでは、sslを使用してデータを送信します。登録ユーザパスワードの際

は、データベースに送られる前に、このようになりましたcrypt編です:

$salt = to64(getRandomBytes(16)); 

if (CRYPT_BLOWFISH == 1) 
    $securePassword = crypt($password, '$2a$10$'.$salt); 

セッションは現在、代わりに平文クッキーの承認を使用して、php.iniファイルが含まれています。

session.use_trans_sid = 0 
session.use_only_cookies = 1 
session.hash_function = sha512 
session.hash_bits_per_character = 5 

セッションはこのように開始され、設定され、セッション内で安全なデータが保持されないようにします。

session_set_cookie_params("86400", "/"); 
session_name("auth"); 
session_start(); 

$_SESSION['userId'] = $row[0]; 
$_SESSION['created'] = time(); 
ユーザーはこの時間内に再びサイトを使用しない場合は

if($_SESSION['created'] + 30 * 60 < time()) 
{ 
    session_regenerate_id(); 
    $_SESSION['created'] = time(); 
} 

セッションは24時間後に有効期限が切れるように設定され、これが長すぎる:システムは、回転が保たれるように

セッションIDのは30分ごとに再生成されます時間の量?

セッションにip/httpユーザエージェントのチェックを追加することもできますが、現時点ではidが偽造できないので大丈夫ですか?

私は眩しいセキュリティホールを逃しましたか?

また、このシステムはopenidと連携して動作し、私たちのサーバは電子メール、ユーザー名、生体情報だけではなく、クレジットカードなどの詳細情報を保存することはないと指摘します。

+1

ユーザーがlogin/passを入力したときにsslを使用すると、この場合ほとんどすべてのことが可能になりました。もう少し追加しますが、ユーザーのログイン/パスを受け入れる直後に 'session_regenerate_id'を実行してください。任意の種類のセッション固定を取り除くこと。 – dmitry

+0

24時間は非常に長いセッションタイムアウト時間です。私は、ほぼすべてのサイトで8時間で十分であると言います。通常30〜60分は「正常」とみなされます。 – Jacco

答えて

1

あなたは「ログインと登録ページはsslを利用しています」と書いたのは、他のページではHTTPに切り替えるという意味ですか?この場合、セッションクッキーはこの他のページ(またはイメージリクエスト)のために平文で送信されます。

あなたはセッションクッキーのみHTTPSページに送信されていますが、HTTPページのセッションを失うことを、確認することができます:

session_set_cookie_params('86400', '/', '', true, true); 

注最初true、それはクッキーが送信されることを意味しHTTPSページのみ。 2つ目のtrueは、JavaScriptがセッションクッキーにアクセスしてはならないことをブラウザに伝えます(ブラウザが正しく実行されているかどうかによって異なります)。

私は、これらのソリューションのいずれかを示唆している:

  1. 使用HTTPSサイト全体のために、これは最も簡単で安全な方法です。
  2. 2つの懸念事項を分離し、セッションを維持し、認証します。この記事では、安全にどのようにしてswitch between HTTP and HTTPSを使用できるかを示します。
+0

現時点で私の広告提供者はタグの1つに 'https'を使用していないので、安全でない警告を出さずにサイト全体を使用することはできませんが、これで作業しています。それでは、ユーザーがログインしている場合は、httpsを使用してください。一時的な '$ _SESSION ['ip'];'チェックを実装すると、httpsがソートされ有効にされるまで停止するでしょうか? – Dan

+0

@ Silver89:特定のユーザーがプロキシサーバーに応じて異なるIPアドレス間でバウンスする可能性があるので、私はそれを信じません。 – NotMe

+0

@ Silver89 - そうすることをお勧めします。たとえログイン前であっても常にHTTPSを使用する方が良いでしょう。次に、HTTPSのみを配信するようにサーバーを構成し、ログイン後にHTTPが許可されないようにする必要はありません。 – martinstoeckli

関連する問題