2016-09-28 7 views
1

私が十字架に執着する前に、私はこれを1週間続けてきました。私はこのプラットフォーム上のpassword_hashpassword_verifyに関するすべての記事も読んだことがありますが、文字列の長さとデータベースの長さなどからは解決策がありませんでしたので、質問を投稿することにしました。Password_Hash、Mysql、SetFetchMode、Password_verify

私はログインスクリプトを書いており、私はpassword_verifyを使用しました。私はちょうどPHPでセキュリティを学び、自分のコードを改善したいと思っていました。

ログインしようとするたびにログインしません。

public function create() { 

    // Don't forget your SQL syntax and good habits: 
    // - INSERT INTO table (key, key) VALUES ('value', 'value') 
    // - single-quotes around all values 
    // - escape all values to prevent SQL injection 
    /* $sql = "INSERT INTO users (username, password, first_name, last_name) 
         VALUES(?, ?, ?, ?)";*/ 
    $sql = "INSERT INTO users (username, password, email, date_created) 
         VALUES(:username, :password, :email, :date_created)"; 
    try { 
     // prepare sql and bind parameters 
     $core = ConnectionManager::getInstance(); 
     $stmt = $core->con->prepare($sql); 
     /*$stmt = $db->prepare("INSERT INTO users (id, username, password, first_name, last_name) 
      VALUES (:id, :username, :password, :first_name, :last_name");*/ 
     //$stmt->bindParam(':id', 1); 

     $username = $this->username; 
     $password = password_hash($this->password, PASSWORD_BCRYPT); 
     $email = $this->email; 
     $date_created = strftime("%Y-%m-%d %H:%M:%S", time()); 

     /*$username = "boiy"; 
     $password = password_hash("redrum", PASSWORD_BCRYPT); 
     $email = "[email protected]"; 
     $date_created = strftime("%Y-%m-%d %H:%M:%S", time());*/ 

     $stmt->bindParam(':username', $username, PDO::PARAM_STR); 
     $stmt->bindParam(':password', $password, PDO::PARAM_STR); 
     $stmt->bindParam(':email', $email, PDO::PARAM_STR); 
     $stmt->bindParam(':date_created', $date_created, PDO::PARAM_STR); 

     if($stmt->execute()) { 
      $this->id = $core->con->lastInsertId(); 
      echo "New records created successfully"; 
      return true; 
     } else { 
      return false; 
     } 

    } catch (PDOException $e) { 
     echo "Insert Error: " . $e->getMessage(); 
    } 
} 

これは新しいユーザーを作成するためです。出来た。

は、その後、私は、ユーザーがログインしようとした:

if($session->is_logged_in()) {redirect_to("admin.php");} 

// Remember to give your form's submit tag a name="submit" attribute! 
if (isset($_POST['submit'])) { // Form has been submitted. 

    $username = trim($_POST['username']); 
    $password = trim($_POST['password']); 
    $YRJWA = "YRJWA"; 
    $string = "$2y$10$$YRJWA/EJQGkmqev6VlpteOXHwF6DeQWcU1x1uGqmOdY4CDK5.oJYi"; 

    // Check database to see if username/password exist. 
    $found_user = User::authenticate($username, $string); 


    if ($found_user) { 
     //if (password_verify($password, $found_user->password)) { 
      $session->login($found_user); 
      log_action('Login', "{$found_user->username} logged in."); 
      redirect_to("admin.php"); 
     //} 
    } else { 
     // username/password combo was not found in the database 
     $message = "Username/password combination incorrect."; 
    } 

} else { // Form has not been submitted. 
    $username = ""; 
    $password = ""; 
} 

私はこれを行うと、それは動作しません。 password_verifyを入力すると機能しませんので、上のコードのようにコメントアウトしました。

私は、そこに新しいページを作成し、自分のコードをテストした:

$YRJWA = "YRJWA"; 
$string = "$2y$10$$YRJWA/EJQGkmqev6VlpteOXHwF6DeQWcU1x1uGqmOdY4CDK5.oJYi"; 
//$string = 'redrum'; 
echo "<hr>"; 
$found_user = User::authenticate('boiy', $string); 
print_r($found_user); 
echo "<br>"; 
/*echo strlen($found_user->password);*/ 
/*echo utf8_encode($found_user->password); 
echo utf8_decode($found_user->password);*/ 
echo "<br/>"; 
//echo substr($found_user->password, 0, 60); 
var_dump($found_user->password); 

echo "<br>"; 
if(password_verify('redrum', $found_user->password)) { 
    echo "Valid"; 
} else { 
    echo "Invalid"; 
} 
ConnectionManager::close(); 

を、私は、データベースから直接パスワードを使用する場合、それは「有効」、右データやプリントを返します。私は、コメントを削除し、しようとすると

は「redumは、」それは、このエラーに

お知らせを与える:\ xamppの\ htdocsに\ WealthPlusプライベート\ \ index.phpを上:C内の非オブジェクトのプロパティを取得しようライン36 NULL

お知らせ:Cで非オブジェクトのプロパティを取得しようとすると:\ xamppの\ htdocsに\ WealthPlus行のプライベートの\ index.phpを\ 39 無効

public static function authenticate($username="", $password="") { 
    $sql = "SELECT username, password FROM users WHERE username = :username AND password = :password LIMIT 1"; 
    try { 

      $core = ConnectionManager::getInstance(); 
      $stmt = $core->con->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); 
      $stmt->execute([':username' => $username, ':password' => $password]); 
      $stmt->setFetchMode(PDO::FETCH_CLASS, "User"); 
      $users = $stmt->fetch(); 
     //if (password_verify($password, $users->password)) { 
      return $users; 
     //} 
    //return !empty($users) ? array_shift($users) : false; 
    }catch (PDOException $e) { 
     echo "Error: " . $e->getMessage(); 
    } 
} 
+0

私は必要な場合に画像を投稿します。私は1週間これを行っていて、何が開発中であるかを調べています... PLS HELP – Boiy

+0

データベースから文字列を直接使用すると...動作します。私のパスワード「redrum」に戻し、password_verify関数を使用してください..うまくいきません – Boiy

+1

あなたはフレームワークを正しく使用していますか?あなたはどちらを使っていますか? – RiggsFolly

答えて

0

ハッシュされたパスワードを保存している場合、パスワードでルックアップすることはできません。あなたがする必要があるのは、ユーザーレコードを取得することです。password_verifyを使用してパスワードを確認してください。

あなたも、そこにそのようなコードを持っていることが無効です:

public static function authenticate($username, $password) { 
    try { 
     $core = ConnectionManager::getInstance(); 
     $stmt = $core->con->prepare("SELECT password FROM users WHERE username = :username";, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); 
     $stmt->execute([ ':username' => $username ]); 
     $stmt->setFetchMode(PDO::FETCH_CLASS, "User"); 

     $user = $stmt->fetch(); 

     if (password_verify($password, $user['password'])) { 
      return $users; 
     } 
    } catch (PDOException $e) { 
     echo "Error: " . $e->getMessage(); 

     return false; 
    } 
} 

は、覚えておいてくださいusernameのようなものにUNIQUE制約を追加し、2を取得することは不可能であるようにあなたを約LIMIT 1を心配する必要はありません行。

+0

ありがとうございます...これはとても役に立ちます – Boiy

関連する問題