6

まず、ローカルホストでテストしています。次の「remember me」チェックボックスを含むこのindex.phpファイルがあります。

<input type="checkbox" id="login_remember" name="login_remember">

ログイン フォームは、次の php スクリプトを含む loginvalidate.php に送信されます。コードを読むプロセスを容易にするために、多くのコメントを含めました。以下のすべてが正常に機能することを確信していることに注意してください。

if (isset($_POST['login_submit'])) {  //SETS VARIABLES FROM FORM
$email = $_POST[trim('login_email')];
$password = $_POST['login_password'];
$remember = isset($_POST['login_remember']) ? '1' : '0';

$db_found = mysqli_select_db($db_handle,$sql_database);  //OPENING TABLE

$query = "SELECT password FROM registeredusers WHERE email = '$email'";
$result = mysqli_query($db_handle, $query) or die (mysqli_error($db_handle));

$row = mysqli_fetch_assoc($result);
$numrows = mysqli_num_rows($result);
if ($numrows!=0)  //IF EMAIL IS REGISTERED
{
  if ($row['password'] == $password) {  //IF PASSWORD IN DATABASE == PASSWORD INPUT FROM FORM
        if ($remember == '1'){  //IF USER WANTS TO BE REMEMBERED
        $randomNumber = rand(99,999999);  //RANDOM NUMBER TO SERVE AS A KEY
        $token = dechex(($randomNumber*$randomNumber));  //CONVERT NUMBER TO HEXADECIMAL FORM
        $key = sha1($token . $randomNumber);
        $timeNow = time()*60*60*24*365*30;  //STOCKS 30 YEARS IN THE VAR

         $sql_database = "registeredusers";
         $sql_table = "rememberme";

         $db_found = mysqli_select_db($db_handle,$sql_database);  //OPENING TABLE

         $query_remember = "SELECT email FROM rememberme WHERE email = '$email'";  //IS THE USER IN TABLE ALREADY
         $result = mysqli_query($db_handle, $query_remember) or die (mysqli_error($db_handle));

        if (mysqli_num_rows($result) > 0) {  //IF USER IS ALREADY IN THE REMEMBERME TABLE
         $query_update = "UPDATE rememberme SET
         email      = '$email'
         user_token = '$token'
         token_salt = '$randomNumber'
         time       = '$timeNow'";
    }
    else {  //OTHERWISE, INSERT USER IN REMEMBERME TABLE
         $query_insert = "INSERT INTO rememberme
        VALUES( '$email', '$token', '$randomNumber', '$timeNow' )";
    }
  setcookie("rememberme", $email . "," . $key, $timenow);
    }
          header('Location: homepage.php');  //REDIRECTS: SUCCESSFUL LOGIN
        exit();
    }

次に、インターネット ブラウザーを閉じて index.php に戻ったときに、Cookie がユーザーを自動的に接続するようにします。これは私のindex.phpにあります:

include 'db_connect.php';
    $sql_database = "registeredusers";
    $db_found = mysqli_select_db($db_handle,$sql_database);  //OPENING TABLE
    session_start();
    if (isset($_COOKIE['rememberme'])) {
        $rememberme = explode(",", $_COOKIE["rememberme"]);
        $cookie_email = $rememberme[0];
        $cookie_key = $rememberme[1];

        $query_remember = "SELECT * FROM rememberme WHERE email = '$cookie_email'";  //IS THE USER IN TABLE ALREADY
        $result_remember = mysqli_query($db_handle, $query_remember) or die (mysqli_error($db_handle));

        $row = mysqli_fetch_assoc($result_remember);
            $token = $row['user_token'];
            $randomNumber = $row['token_salt'];
        $key = sha1($token . $randomNumber);  //ENCRYPT TOKEN USING SHA1 AND THE RANDOMNUMBER AS SALT

        if ($key == $cookie_key){
            echo "lol";
        }
    }

問題は、「笑」が決して反響しないことです。また、ユーザーを接続する方法について洞察を持っている人はいますか? 別名、これらの行の中に何を入れるべきですか:

if ($key == $cookie_key){
            echo "lol";
        }

ありがとうございました!私はまだ PHP と SQL に慣れていないので、初歩的な間違いを犯した場合はご容赦ください。

EDIT!: 私のコードを何度も見直した後、私のエラーはこれらの行にあるのではないかと思います。構文と、値を $token と $randomNumber に格納するために使用している方法についてはわかりません。

$query_remember = "SELECT * FROM rememberme WHERE email = '$cookie_email'";  //IS THE USER IN TABLE ALREADY
    $result_remember = mysqli_query($db_handle, $query_remember) or die (mysqli_error($db_handle));

    $row = mysqli_fetch_assoc($result_remember);
        $token = $row['user_token'];
        $randomNumber = $row['token_salt'];
4

3 に答える 3

28

PHP のログイン スクリプトは、セッションを使用して実装できます。

セッションの使用

簡単に言えば、セッションは一意であり、ページが開いている限り (またはタイムアウトするまで) 存続します。ブラウザーが閉じられている場合、セッションにも同じことが起こります。

それの使い方?

それらは実装が非常に簡単です。まず、各ページの先頭でセッションを開始してください。

<?php session_start(); ?>

注: この呼び出しは、ページ出力の前に行うことが重要です。そうしないと、「ヘッダーは既に送信されました」というエラーが発生します。

よし、これでセッションが稼働中です。次はどうする?それは非常に簡単です。ユーザーはログインフォームからログイン/パスワードを送信し、それを検証します。ログインが有効な場合は、セッションに保存します。

if($validLoginCredentials){
    $_SESSION['user_id'] = $id;
    $_SESSION['user_login'] = $login;
    $_SESSION['user_name'] = $name;
}

または配列として(私が好む):

if($validLoginCredentials){
    $_SESSION['user'] = array(
        'name' => $name,
        'login' => 'login',
        'whichever_more' => $informationYouNeedToStore
    );
}

わかりました、これでユーザーがログインしました。では、どうすればそれを確認/確認できますか? ユーザーのセッションが存在するかどうかを確認するだけです。

if(isset($_SESSION['user_id'])){ // OR isset($_SESSION['user']), if array
// Logged In
}else{
// Not logged in :(
}

もちろん、さらに進んで、セッションが存在するかどうかを確認するだけでなく、セッションに保存されたユーザー ID をデータベースで検索して、ユーザーを検証することもできます。それはすべて、必要なセキュリティの程度によって異なります。

最も単純なアプリケーションでは、ログイン アクションで手動で設定しない限り、$_SESSION['user'] は存在しません。したがって、その存在を確認するだけで、ユーザーがログインしているかどうかがわかります。

ログアウト: 破棄するだけです。あなたが使用することができます

session_destroy();

ただし、これにより、そのユーザーに対して設定したすべてのセッションが破棄されることに注意してください。$_SESSION['foo'] と $_SESSION['bar'] も使用した場合、それらも削除されます。この場合、特定のセッションの設定を解除するだけです:

unset($_SESSION['user']);

そして完了!ユーザーはもうログインしていません! :)

それだけです。繰り返しになりますが、これらは非常に単純なログイン方法の例です。アプリケーションのセキュリティ要件に応じて、セキュリティ チェックのレイヤーをさらに追加して、コードを改善する必要があります。

于 2013-09-11T14:15:04.010 に答える