2014-11-18 6 views
-1

На моем веб-сайте есть возможность сделать вход и войти в систему. Я хотел использовать новые функции доступа PHP password_hash и password_verify для лучшей безопасности. На моем собственном компьютере у меня PHP 5.5, поэтому функции работают нормально. Тем не менее, в моем веб-отеле есть PHP с версией 5.2, поэтому мне пришлось загружать пароли с Github. Теперь функции не работают. Похож, что password_hash ничего не возвращает, потому что у меня ничего нет в базе данных после регистрации.Функции php password не работают

Я проверил журнал ошибок, и в этом ничего нет. И да, у меня есть error_reporting по E_ALL | E_STRICT, log_errors и я ищу правильный файл.

Я повторяюсь: функции работают без каких-либо проблем, как жестко закодированные на моем компьютере (PHP 5.5), но не работают как загруженные (PHP 5.2).

Мой код:

// model: 
public function getUser($email, $pass) { 
    $this->search("SELECT * FROM users WHERE email = ?", array($email)); 
    if($this->countRows() <= 0) { 
     return false; 
    } 
    $row = $this->fetchRow(); 
    if(!password_verify($pass, $row["password"])) { 
     return false; 
    } 
    if(password_needs_rehash($row["password"], PASSWORD_DEFAULT)) { 
     $this->run("UPDATE users SET password = ? WHERE id = ?",array(password_hash($pass,PASSWORD_DEFAULT),$row["id"])); 
    } 
    return $row; 
} 

public function userExists($email) { 
    $this->search("SELECT * FROM users WHERE email = ?", array($email)); 
    if($this->countRows() <= 0) { 
     return false; 
    } 
    return true; 
} 

// sign up 
public function reg() { 
    if($this->model->userExists($_POST["email"])) { 
     header("Location: " . PUBLICROOT . "/index/index/error/emailAlreadyExists"); 
     die(); 
    } 
    $this->model->run("INSERT INTO users (firstname, lastname, email, password, birthday) VALUES (?,?,?,?,?)", 
      array($_POST["firstname"],$_POST["lastname"],$_POST["email"], 
       password_hash($_POST["password"],PASSWORD_DEFAULT),$_POST["birthday"]."-".$_POST["birthmonth"]."-".$_POST["birthyear"])); 
    $this->in(); 
} 

// sign in 
public function in() { 
    $u = $this->model->getUser($_POST["email"],$_POST["password"]); 
    if($u === false) { 
     header("Location: " . PUBLICROOT . "/index/index/error/signInFailed"); 
     die(); 
    } else { 
     $_SESSION["userid"] = $u["id"]; 
     $_SESSION["email"] = $_POST["email"]; 
     $_SESSION["firstname"] = $u["firstname"]; 
     $_SESSION["lastname"] = $u["lastname"]; 
     $_SESSION["time"] = time(); 
     header("Location: " . PUBLICROOT . "/home/index"); 
     die(); 
    } 
} 

Любые идеи?

+0

*** Для этой библиотеки требуется PHP> = 5.3.7 или версия, в которую в нее входит резервное копирование $ 2y (например, RedHat). *** 5.2 is * sooo * не поддерживается этой библиотекой. – deceze

ответ

2

Может хотите read the README

Эта библиотека требует PHP> = 5.3.7 или версию, которая имеет $ 2y затруднительное портированном в него (например, RedHat предоставляет).

+0

Черт возьми, не видел этого. Какие-либо предложения? Я не хочу использовать md5. –

+0

'password_hash' - это просто оболочка для [crypt] (http://us3.php.net/manual/en/function.crypt.php), которая доступна для всех версий PHP5 – Machavity

+0

... с предостережением, которое Версии PHP до 5.3.7 содержат ошибку в склепе, которая существенно ослабляет пароли, хэшированные с ним, поэтому существует ограничение версии. Используйте свой собственный риск, @ user3725053. – deceze

1
  • PHP 5.5 предлагает функцию password_hash(), которая использует алгоритм BCrypt.
  • С PHP 5.3.7 вы можете использовать compatibility pack.
  • Начиная с PHP 5.3 можно использовать BCrypt (алгоритм «2а» вместо «2у»)
  • Ранее PHP версии не поддерживают Bcrypt, вы лучше всего, вероятно, phpass библиотека, хотя они также имеют запасной вариант для менее безопасный алгоритм. Возможно, вы можете найти расширение, которое вы можете установить на свой сервер с поддержкой BCrypt.