以前は、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と連携して動作し、私たちのサーバは電子メール、ユーザー名、生体情報だけではなく、クレジットカードなどの詳細情報を保存することはないと指摘します。
ユーザーがlogin/passを入力したときにsslを使用すると、この場合ほとんどすべてのことが可能になりました。もう少し追加しますが、ユーザーのログイン/パスを受け入れる直後に 'session_regenerate_id'を実行してください。任意の種類のセッション固定を取り除くこと。 – dmitry
24時間は非常に長いセッションタイムアウト時間です。私は、ほぼすべてのサイトで8時間で十分であると言います。通常30〜60分は「正常」とみなされます。 – Jacco