PHP - сравнение хэша с базой данных не работает - PullRequest
0 голосов
/ 15 февраля 2012

Примечания:

  • Я все еще довольно новичок в php
  • Эта форма входа, кажется, отлично работает, если я не хеширую пароль.
  • Я пробовал md5, sha256 и теперь я оставил его на sha1. Ни одна из этих работ.
  • Сначала я использовал echo sha1("password");, чтобы узнать, каким будет хеш для моего пароля, затем скопировал этот хеш и вставил его вручную с помощью phpMyAdmin. Я не уверен, в этом ли проблема или нет.

В любом случае вот код:

<?php
session_start();
require("config.php");

if(isset($_POST['submit'])) {

    $username = mysql_real_escape_string($_POST['username']);
    $password = sha1(mysql_real_escape_string($_POST['password']));

    $loginsql = "SELECT * FROM login WHERE username = '" . $username .
    "' AND password = '" . $password . "'";
    $loginresult = mysql_query($loginsql);
    $loginnumrows = mysql_num_rows($loginresult);

    if($loginnumrows == 1) {
        $loginrow = mysql_fetch_assoc($loginresult);
        session_register("USERNAME");
        session_register("USERID");

        $_SESSION['USERNAME'] = $loginrow['username'];
        $_SESSION['USERID'] = $loginrow['id'];

        header("Location: " . $config_basedir . "controlpanel.php");
    }
    else{
        echo "<p>Incorrect Login, please try again!</p>";
    }
}
else{

}
?>

Я действительно не очень уверен, куда идти с этим. Я уверен, что мой код может быть более эффективным, но, как я уже упоминал в примечаниях, он работает, когда я не хеширую пароль. Спасибо за чтение.

Ответы [ 4 ]

4 голосов
/ 15 февраля 2012

Это не будет работать, если ваш пароль содержит ' или другие экранируемые символы.

$password = sha1(mysql_real_escape_string($_POST['password']));

Сначала вы должны хешировать, затем убежать:

$password = mysql_real_escape_string(sha1($_POST['password']));

И поскольку SHA1 содержит только [a-f0-9], вы также можете пропустить эскапинг

$password = sha1($_POST['password']);
1 голос
/ 15 февраля 2012

Кажется, что ваши пароли в базе данных не хэшированы, вам нужно изменить это и форму регистрации, чтобы все использовали один и тот же метод хеширования.

Вы можете изменить все пароли в базе данных, используя MySQLsSHA1() функция.

1 голос
/ 15 февраля 2012

Если это работает, когда вы не хешируете пароль, похоже, что ваши пароли хранятся в базе данных в виде открытого текста - вот где я бы проверил.

Другая вещь, которая может происходить, - этоСтрока mysql_real_escape должна использоваться на другой стороне sha1, чтобы она не мешала точному вводу.

Так должно быть: mysql_real_escape_string(sha1($_POST['password'])); Это может немного изменить ситуацию.

Примечание. Хотя у sha1 в настоящее время нет известных проблем безопасности, поэтому должен быть безопасным для непосредственного размещения в базе данных без выхода mysql, кто-то однажды сказал мне всегда проверять, все ли в базу данных должнобыть брошенным или сбежавшим на случай, если в чем-то вроде sha1 или md5 обнаружена уязвимость безопасности.

0 голосов
/ 15 февраля 2012

Экранированный пароль отличается от введенного пароля. Хэд не будет содержать никаких специальных символов.

abc 'sha1! = Сбежал abc \' sha1

...