0

PHPログインスクリプトを探しています。私はstackoverflowを検索し、多くの投稿を見てきましたが、誰かが最良の方法をお勧めできますか?また、ハッシュを使用したい場合、取得時にパスワードをどのようにデコードしますか?私のiPhoneアプリは同じデータベースを使用しており、現在、パスワードは通常のテキストで保存されています(あまり安全ではありません)。

また、info.phpにリダイレクトするログインページを実装する場合、ユーザーがログインせずにinfo.phpページに直接アクセスするのを防ぐにはどうすればよいですか?セッション制御?

ご意見をお待ちしております。どうもありがとう。

4

7 に答える 7

4

私の答えには少し遅れていますが、とにかく投稿します。これは質問に直接答えないことはわかっていますが、それでも問題はありません。ログインセキュリティに関するいくつかのポイントがあります。

私を覚えてますか

ハッシュ化されたパスワードを再ハッシュし、ユーザーの自動ログインに使用されるCookieに再ハッシュを保存することをお勧めします。パスワードを再ハッシュするときは、ブラウザーの種類など、ブラウザーに固有のものをシードとして使用します。これにより、Cookieが盗まれるのを防ぐことができます(ネットワークトラフィックをスヌーピングする人を介して)。これにより、レインボーテーブルを使用する可能性を防ぐことができます。

セッション

セッションハイジャックに注意してください:http://en.wikipedia.org/wiki/Session_hijacking

CSRF

クロスサイトリクエストフォージェリ-ログイン後に実装されますが、ログインしたメンバーにのみ影響するため、注意が必要です:http: //en.wikipedia.org/wiki/Cross-site_request_forgery

HTTPS

HTTPSは、ログイン要求の送信先のページで使用する必要があります。ログインの詳細を入力するページでHTTPSを使用する必要はありません。

ハッシュ

HTTPSを使用していないときに、メンバーがネットワーク経由でパスワードを転送するときにパスワードが盗まれるのを防ぐためにのみサーバーとなるjavascriptを使用して、パスワードクライアント側をハッシュできます。多くの人が多くのサイトで同じパスワードを使用することが多いため、これは良いことです。欠点は次のとおりです。サーバー側でパスワードの長さを確認できず、JavaScriptが無効になっている場合はログインできません(ただし、ある程度プログラムすることはできます)。Yahooはこの数年前に(今でもそうかもしれないが)やっていた。

サーバーでパスワードを受け取ると、シードを使用してパスワードが再ハッシュされ、データベースに保存されることがよくあります。ハッシュを知っていてもログインできないので、これはより安全です!元のパスワードのみが同じハッシュに再ハッシュされ、ユーザーがログインできるようになります。

キーロガー

キーロガー(またはそれらのほとんど)を回避したい場合は、JavaScriptキーパッド/キーボードを追加することで回避できます。次に、ユーザーは文字と数字をクリックして、キーボードの代わりにマウスを使用してパスワードを入力します。これは、キーロガーがパスワードを記録するのに苦労していることを意味します。

何かを知っている、何かを持っている、何かである

セキュリティの3つのレベル。パスワードなどの誰かが知っているもの、電話などの誰かが持っているもの(Googleは2段階の検証を使用してこれらの最初の2つを完了します)、および指紋などの誰か。これらを多く満たすほど、セキュリティクレデンシャルは大きくなります-長い目で見れば!!!

ボット

コンピューターは、高速ログインページをブルートフォース攻撃しようとすることがあります(パスワードが間違っているかのように高速である必要があり、スクリプトは1秒でも一時停止します。これにより、ボットが実行できるログイン試行の総数が大幅に減少します。これを停止するには、一時停止することができます。 1〜2秒間の不正なログイン(linuxのように)または、X回の不正なログイン(googleのように)の後でボットが解決するのに苦労するキャプチャを生成できます。

主なポイントはありますが、他にもあると思います。

于 2012-11-22T13:58:54.167 に答える
3

まだ開発中ですが、安全で、高速で、クリーンで、優れており、最新です。

[最新バージョン] https://github.com/Panique/PHP-ログイン

[旧バージョンのウェブサイト] http://www.php-login.net

私はこれをデザイナーとコーダーの助けを借りて作成しました。それはいくつかのフォーラムで議論されており、非常に肯定的な回答を得ています。現在のすべての問題は、githubの問題ページで確認できます。すべてのコードは公開されており、無料でフォーク可能です。

于 2012-11-22T13:35:25.993 に答える
3

HTTPSURLにPOSTします。

ハッシュされたパスワードをデコードすることはありません。紛失したパスワードを処理するには、別のメカニズムが必要です。

はい、セッション制御。ログイン時にセッションにフラグを設定し、他のページで確認してください。

于 2010-10-20T04:51:22.477 に答える
3

これは、ログインシステムの設計に関する優れたチュートリアルです。オブジェクト指向の方法ですべての主要なトピックをカバーし、さまざまな考慮事項について学ぶのに最適です。

デコード可能なパスワードは、可能な限り安全ではありませんが、例外なく、パスワードを自由に取得および変更できることをクライアントに要求してきました。そのため、場合によっては、base64でエンコードされた文字列をソルトしてデータベースに格納することを選択しましたが、これはかなりうまく機能しているようです。管理者ユーザーの必要に応じてエンコード/デコードする機能があります。

実際、セッション制御(および/またはCookie)はアクセスを制御する方法です。オブジェクト指向パターンで構築すると、ページごとに1行か2行のコード(または、一般的な場合はヘッダー内の1行)でそれを行うことができます。

私の1つの警告は、共通のログインレベルを持っているか、ユーザーレベルの権限が必要かどうかを検討することです。サイトを構築した後で、権限ベースのログインが重要であると判断するのは、はるかに手間がかかります。最初に計画されていなければ、それは本当のモンスターになることができます。

于 2010-10-20T04:57:45.627 に答える
2

パスワードをデコードする必要はありません。ハッシュされたパスワードをデータベースに保存する必要があります。ユーザーがログインしようとすると、保存されたパスワードを入力されたパスワードのハッシュと比較します。

info.phpについては、はい、ログインが成功した場合はセッションで変数を割り当て、ユーザーがログに記録されているかどうかをテストするには、その変数が割り当てられているかどうかをテストするだけです。

于 2010-10-20T04:52:17.407 に答える
2

基本的に、悪意のある目的でパスワードを取得できないようにパスワードをハッシュします。ハッシュは、パスワードの代わりにクリアテキストでデータベースに保存され、2つのハッシュ値のみを比較します。

クライアントは必要に応じてパスワードを保存できますが、Webアプリケーションは各ステップでセッションの有効性を制御する必要があります(ログインした識別子を適切な有効期限などでセッション変数に保存します)。したがって、基本的にrequire("session_control.inc")はすべての「保護された」ページにアクセスします。したがって、セッションの有効性を確認できます。

最善の方法は、その場合のロジックの定義に役立つMVCフレームワークを使用することです。

于 2010-10-20T04:57:40.337 に答える
0

パスワードハッシュを使用できますが、phpのcrypt()関数http://php.net/manual/en/function.crypt.phpもあります。

それらは本質的に同じことをしますが、cryptは少しきちんとしたIMOです。優れたソルト生成スクリプトも取得するようにしてください。データベースにパスワードを保存するときに、これが私のパスワード暗号化機能です。ソルト機能がないと、これはそれほど安全ではないことに注意してください。

function crypt_password($password)
{
    if($password){
        //blowfish hashing with a salt as follows: "$2a$", a two digit cost parameter, "$", and 22 base 64
        $blowfish = '$2a$10$';

        //get the random bytes and makes a salt
        $salt = $this->get_salt();

        //append salt2 data to the password, and crypt using salt, results in a 60 char output
        $crypt_pass = crypt($password,$blowfish . $salt);

        //blowfish comes out as 60, check
        $len = strlen($crypt_pass);

        if($len == 60)
        {
            return $crypt_pass;
        }
        else {
            throw new Exception('encryption failed');
            return false;
        }
    }
    else {
        throw new Exception('encryption failed, missing password');
        return false;
    }
}

次に、このパスワードを確認する場合は、データベースにログイン電子メールまたはユーザーIDを照会するだけで、次のように簡単に確認できます。

if (crypt($input_pass, $stored_pass) == $stored_pass) {
    return true;
}
于 2010-10-20T05:09:57.953 に答える