ホーム>source

ユーザー認証のためにこの認証システムに取り組んでいますが、フィードバックをお願いします。

私の考えはこれです。セッションと1つの追加Cookieを使用します。セッションCookieと追加のCookieは連動します。私のログインする クラス、ユーザー名とパスワードが正しいかどうかを確認した後、呼び出しますsessionStart メソッドとデータベースからユーザーのIDを送信:

public function sessionStart($id) {
    session_start();
    $cookieName = "RagingBull";
    $hash = $this->loginHash($id);
    setcookie($cookieName, $hash);
}

私のsessionStartメソッドでは、loginHash メソッドが呼び出されます。 loginHashメソッドは、ハッシュを作成し、セッションCookieと追加のCookieをリンクします。

public function loginHash($id) {
    $timeStamp              = time();
    $randNumber             = mt_rand(0, 1000);
    $userId                 = $id;
    $_SESSION['timeStamp']  = $timeStamp;
    $_SESSION['randNumber'] = $randNumber;
    $_SESSION['userId']     = $id;
    $userAgent              = $_SERVER['HTTP_USER_AGENT'];
    $salt                   = "On the Waterfront";
    $ipFrag                 = substr($this->getUserIP(), 0, 5);
    $forHash                = $timeStamp.$salt.$userId.$ipFrag.$randNumber.$userAgent;
    $hash                   = md5($forHash);
    return $hash;
}

ハッシュ値を作成するために、私は使用します

  • timeStamp。これはセッションCookieにも保存されます
  • セッションCookieに保存されるrandNumber
  • セッションCookieに保存されるuserId
  • ユーザーエージェント、
  • サーバー上で内部的に保存されるソルト
  • ipFrag、ユーザーのIPアドレスの単なる断片。

後で比較用のハッシュを作成するときに使用できるように、セッションCookieにいくつかの値を保存します。その後、sessionStartメソッドに戻り、返されたハッシュ値で追加のCookieを作成し、ユーザーがログインします。

認証のために、私は持っていますセッション クラス。

class Session {
public function __construct() {
    session_start();
    // checks to see if all the cookies are there
    if(!isset($_SESSION['userId']) || !isset($_COOKIE['RagingBull'])) {
        header("Location:http://localhost/login.php");
    }
    //create hash for comparison
    $hash = $this->loginHash();
    //if hashes are not the same, redirect
    if(strcmp($hash, $_COOKIE['RagingBull']) !== 0) {
        header("Location:http://localhost/login.php");
    }
}
public function loginHash() {
    $timeStamp  = $_SESSION['timeStamp'];
    $randNumber = $_SESSION['randNumber'];
    $userId         = $_SESSION['userId'];
    $userAgent  = $_SERVER['HTTP_USER_AGENT'];
    $salt       = "On the Waterfront";
    $ipFrag     = substr($this->getUserIP(), 0, 5);
    $forHash    =  $timeStamp.$salt.$userId.$ipFrag.$randNumber.$userAgent;
    $hash       = md5($forHash);
    return $hash;
}
public function getUserIP() {
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}
}

それを使用するには、Sessionクラスのインスタンスを作成するだけです。次に、コンストラクターで、基本的なチェックの後、比較のためのハッシュの作成があります。以前に保存したセッションCookieのtimeStamp、userId、およびrandNumberを使用し、それらをページを要求したユーザーのユーザーエージェントおよびIPフラグメントと組み合わせます。

  • セキュリティまたはロジックに明らかな欠陥はありますか?
  • 十分に安全ですか?
  • サーバーがすべてのページ要求に対して行う作業が多すぎますか?
  • これは不要ですか?
あなたの答え
  • 解決した方法 # 1

    このコードは多くの無意味なことを安全ではありません。

    mt_rand() を使用する   random_int() の代わりに 。

    md5($var) を使用する   hash('sha256', $var) の代わりに

    md5($password) を使用する   password_hash() の代わりに  および password_verify()

    「ログインハッシュ」はまったく意味がありません。

    永続的な認証(つまり、 "remember me" Cookie)を実行しようとしている場合は、それを実装するだけです。

    セッション攻撃から保護しようとしている場合は、TLSを使用してください(そして、セッションIDが /dev/urandom から生成されていることを確認してください  まだPHP 5)およびストリクトモードを使用している場合。 session_regenerate_id(true) を呼び出す  ユーザーがログインまたはログアウトするたび。できた

    ここでのハッシュは値を追加せず、安全な認証用ではないツールを使用しています。

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ sbt - jarファイル内のファイルへのパスがjarファイルにある問題