0

この特定の分野については本当にたくさんの質問があります。sessionしかし、基本的には、最も効率的で安全な php通信方法を作成する方法を知りたいだけです。私はこれについて話している非常に多くのウェブサイトを読みましたが、それらは私の現在の状況に同意または関連していないようです.

私の問題は、ログイン、セッション、Cookie、登録などを適切に作成して、高いセキュリティレベルに合わせる方法がわからないことです。これがこれまでの私の考えです。

1. PHP セッション

ログイン後、セッションを開始します。これらを処理するにはさまざまな方法があることはわかっていますが、現時点では、セッション$_SESSION['user']中にユーザーの電子メール アドレスを保存できるようなセッション変数を作成しました。次に、セッションがサーバーで終了するときに問題が発生します。それは私を次の物件に導きます。

2. クッキー

Cookie を使用すると、電子メール アドレスとハッシュ エンコードされたパスワードを保存し、これらのログイン情報に基づいてセッションを再作成できます。

<?
session_start();
require_once('config.php'); //retrieved from the servers include folder specified on the apache server.

// if session is closed that means that there wouldn't be stored a session variable called 'user' anymore.
if ($_SESSION['user'] == '') {

    // if the cookie hasn't been set..
    if ($_COOKIE['user'] == '') {

        // ... close the session and return to the login page
        session_destroy();
        header('Location: login.php?err=4'); // err=4 means session ended

    } else {

        // We don't know wether the user has logged in using e-mail or username, so that's why we connect using either email or username.
        $sql = 'SELECT * FROM login WHERE (email = :user and password = :psw) or (username = :user and password = :pass)';

        $statement = $conn->prepare($sql);

        $statement->bindParam(':user', $_COOKIE['user'], PDO::PARAM_STR);
        $statement->bindParam(':psw', $_COOKIE['psw'], PDO::PARAM_STR);

        if ($statement->execute() && $row = $statement->fetch()) {

            $_SESSION['user'] = $_COOKIE['user'];

        } else {

            // Failed to retrieve data somehow.
        }
    }
}

?>

しかし、これsession_id()もクッキーに保存された値であり、セッションを再作成するたびに同じになることを読みました。したがって、実際には値をサーバーに再度一致させる必要はありません。セッションを再度開始して、終了した場所から続行できるためです..しかし、これはセキュリティ上の問題と考えsession_id()ています。 、同じものを使用して接続できるようになりますsession_id()

3. 他のドメインの値も使用する必要がある

Facebook や Google などの別の Web サイトから同じログイン情報を使用できることはわかっています。使用しているすべてのドメインで同じログイン情報を再利用できるようにしたいのですが、自分のドメインだけを保護するにはどうすればよいですか (登録済み) ドメインはログイン情報にアクセスできますが、他のサイトにはアクセスできませんか?

4. 他に安全な方法はありますか?

これは実際に私の質問です。私がやった、または計画したことが非常に安全であるかどうか確信が持てません。また、私の初心者の経験が、ログインで安全なデータベース接続を作成するのに十分であるとは絶対に思いません. したがって、PHP でログイン情報を最も効率的かつ安全な方法で保存および使用するための正しい方法の公式ページに誰かが私をリンクできるかどうかを知りたいです。

4

2 に答える 2

2

PHP でログインを処理する場合は、PHP セッションが最適です。保存方法でこれを行うには、セッション データがサーバーに保存され、クライアントが Cookie に session_id のみを持っていることを確認する必要があります。

セキュリティ レベルの変更 (ログイン、ログアウトなど) があるたびに、安全性を高めるためにセッション ID を再生成する必要があります (盗まれた古いセッション ID は使用できなくなります)。また、セッション Cookie を http_only にする必要があります。これにより、JavaScript を使用して Cookie を盗むことができなくなります。

セキュリティの観点から、Cookie を使用して機密情報を保存しないことをお勧めします。クッキーに保存された情報は保存されず、クライアントのコンピューターに保存され、変更または盗まれる可能性があります。

Google と Facebook は、openAuth(2) を使用して、あらゆる種類の Web サイトへのログインを可能にします。それがあなたに役立つかどうかはわかりませんが、Cookie にアクセスできるのは多くても 1 つのドメインだけです。

PHP セッションを使用することをお勧めします。適切に処理すれば安全です。その方法がよくわからない場合は、いくつかの優れた PHP フレームワークを調べることができます。Laravel フレームワークには優れたログイン ハンドラがあることを経験から知っています。

于 2013-02-03T13:05:05.847 に答える
0

セッションは、セッションを維持するために既に Cookie を使用しています。適切に構成すると、必要に応じてセッションを無期限に開いたままにすることができます (ユーザーが Cookie を削除しない限り、ただし、Cookie ベースのソリューションも役に立ちません)。Cookie を使用して自分で作成したものは、おそらくそれよりも安全性が低いため、私は気にしません。もちろん、セッション設定を適切に構成します。

ドメイン間での情報の再利用は複雑な分野です。それらがすべて同じデータベースに支えられている場合は、ユーザーが任意のサイトにログインできるようにします。個別のセッションを管理する必要があります (読み取り: ユーザーは各サイトに個別にログインする必要がありますが、同じユーザー/パスワードを使用できます)、かなり複雑なクロスドメイン セッション共有を構築する必要があります (ヒント: おそらくそうしたくないでしょう)。 . より複雑なソリューションが必要な場合 (たとえば、ドメインが中央データベースを共有していないため)、Google で「シングル サインオン」して、何時間、何日、何週間も読む準備をしてください。

于 2013-02-03T12:57:30.223 に答える