5


5

このスクリプトに自動ログイン機能をどのように実装しますか?

session_start(); $ result = mysql_query( "ユーザーID = '{$ _POST ['ユーザー名 ']}' 'およびパスワード=' {$ _POST ['パスワード']} ''からユーザーを選択します。

if(isset($ _ POST ['savelogin'])){setcookie( "SaveLogin"、$ _POST ['username']、time()3600); setcookie( "SaveLogin"、$ _POST ['パスワード']、time()3600); }

if(mysql_num_rows($ result)== 0){exit( '間違ったユーザー名/パスワード');

} else {$ _SESSION ['id'] = mysql_result($ result、0、 'id'); header( "Location:./"); }



ユーザー名:

パスワード:


自動ログイン?

それは私がどこまで得たか。 ユーザー名とパスワードを保存します。 しかし、自動ログインするにはどうすればいいですか。

3 Answer


13


まず、ユーザー名とパスワードをCookieに保存したくありません。 それは悪い考えです。

これを考える簡単な方法は次のようになります。

1)usersテーブルにMD5ハッシュを格納する新しいフィールドを作成します。 あなたはそれをsession_keyと呼ぶことができます。 2)ページを送信すると、スクリプトは次のことを行います。

  • ユーザー名とパスワードを確認してください

  • ユーザー名とパスワードの組み合わせが正しい場合は、saveLogin変数を確認してください。

  • saveLogin変数が設定されている場合は、md5を生成してデータベースに保存します。 そのmd5もcookieに保存してください。 データベーステーブルにもcookie-expiresフィールドがあることを確認してください。

  • 必要なセッションデータを作成します。

  • ./にリダイレクト

3)./ページで、次の操作を行います。

  • セッションがまだ存在するかどうかを確認してください。 もしそうなら、それからページをレンダリングする。

  • セッションが存在しない場合は、Cookieを確認してください。

  • Cookieが存在する場合は、データベースでそのセッションIDを調べて、有効期限が切れていないことを確認してください。 その後、セッションを構築してページをレンダリングします。

これにより、アプリはもう少し安全になります。 それはコーディングの最善の方法ではないかもしれませんが、概念はかなり安全なログインページを作る方法のアイデアをあなたに与えるべきです。


5


これは自動ログインをするための非常に安全でない方法です。 平文のどこにもパスワードを保管しないでください。

より良い戦略は次のとおりです。

  1. 「自動ログイン」のためのチェックボックスで、通常のログインフォームを提示してください。

    • 自動ログインボックスがチェックされている場合は、通常、それらのユーザー名とパスワードを確認します。 これが成功したら、自動ログイン用の特別なクッキーを設定することができます。

    • 特別なクッキーに 'autologin’のような名前と、それらのユーザ名、そしてユーザデータの塩味のあるmd5ハッシュを含む値を付けます。 "user = username"のようなもの

    • 次回そのユーザーに会い、それらに自動ログインしたいときは、この特別なcookieを調べてその内容を確認します。 ユーザー名とハッシュを分割し、ユーザー名に基づいてデータベースからアカウントを取得し、md5を再実行してCookieハッシュデータと比較します。 それが有効であれば、あなたはそれらをログインすることができます(すなわち。 新しいセッションを開始します。


2


あなたはそれらのユーザ名、IPアドレス、そして(zombatが示唆しているように)何らかの種類のハッシュを取り、(おそらくBase64を使って)それをすべて暗号化し、その結果の文字列をクッキーとして保存するべきです。 こうしても、誰かがクッキーを偽造したり盗んだりすることはできません。たとえたとえたとえたとえたとえたとえそうであったとしても、復号化されたIPアドレスはリクエストが来たIPアドレスと一致しないからです。 ユーザー入力をクエリにドロップするよりも、ホワイトリストを使用することをお勧めします。

だからあなたは何かのようになるでしょう:

//First see if the auto-login cookie exists and is valid:

; if($ _ COOKIE ['autologin']){$ users_query = "ユーザーからユーザー名を選択する場所last_login <SUBDATE(CURDATE()、30)"; $ users_results = mysql_query($ users_query); while($ row = mysql_fetch_assoc($ users_result)){$ users = $ row ['username']; $ auto_cookie = $ _COOKIE ['autologin'];

$ user_creds = explode( "//"、base64_decode($ auto_cookie));

$ user_name = $ user_creds [0]; $ user_IP = $ user_creds [1]; $ user_hash = $ user_creds [2];

$ username_check =(in_array($ user_name、$ users)?) 真偽; $ userIP_check =($ user_IP = $ _SERVER ['REMOTE_ADDR'])) 真偽;

$ so_far_so_good =($ username_check 真偽;

if($ so_far_so_good){$ hash_query = "ユーザーハッシュからハッシュを選択WHERE username = '$ user_name'"; $ hash_results = mysql_query($ hash_query); $ all_clear =($ user_hash == mysql_result($ hash_results、0))? 真偽; }

}

//Checks Login Data:
if($ _ POST){$ users_query = "ユーザーからユーザー名を選択"; $ users_results = mysql_query($ users_query); while($ row = mysql_fetch_assoc($ users_result)){$ users = $ row ['username']; }

$ username_check =(in_array($ user_name、$ users)?) 真偽;

$ password_check = password_check();
// I do not feel comfortable enough with encryption and authentication to suggest
// a method here. Suffice to say, you should have a strong password check system.

$ all_clear =($ username_check 真偽;

// You should only throw a log in error when they have attempted a login. Do not
// give hints at your authentication methods in auto-login section.

$ set_cookie =($ all_clear 真偽; if($ set_cookie){$ new_hash = hash_maker(); //繰り返しますが、最良のハッシュ手法を他の人に見てください。 $ raw_cookie_data = $ user_name "//" $ _SERVER ['REMOTE_ADDR']。 "//" $ new_hash; $ enc_cookie_data = base64_encode($ raw_cookie_data); setcookie( "autologin"、$ enc_cookie_data、time()3600); }}

if($ all_clear){echo "Welcome Back!"; } else {//ここにログインフォームを表示する... }