Создание системы продуктов администратора в PHP - ошибка аутентификации - PullRequest
0 голосов
/ 15 августа 2011

Я создаю сайт электронной коммерции.Я работаю над страницей администратора, которая позволяет «менеджеру магазина» входить в систему, чтобы добавлять или удалять продукты.В моей базе данных я создал таблицу с именем admin, с полями:

  • id
  • пароль
  • time_last_logged_in

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

admin_login.php

<?php 
    session_start();
    if (isset($_SESSION["manager"])) {
        header("location: index.php"); 
        exit();
    }
?>
<?php 
    if (isset($_POST["username"]) && isset($_POST["password"])) {
        $manager = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["username"]); // filter everything but numbers and letters
        $password = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["password"]); // filter everything but numbers and letters
        // Connect to the MySQL database  
        include "../scripts/connect_to_mysql.php"; 
        $sql = mysql_query("SELECT id FROM admin WHERE username='$manager' AND password='$password' LIMIT 1"); // query the person
        // ------- MAKE SURE PERSON EXISTS IN DATABASE ---------
        $existCount = mysql_num_rows($sql); // count the row nums
        if ($existCount == 1) { // evaluate the count
            while($row = mysql_fetch_array($sql)){ 
                $id = $row["id"];
            }
            $_SESSION["id"] = $id;
            $_SESSION["manager"] = $manager;
            $_SESSION["password"] = $password;
            header("location: index.php");
            exit();
        } else {
            **echo 'That information is incorrect, try again <a href="index.php">Click Here</a>';**
            exit();
        }
    }
?>

Я использую сценарий connect_test.php, чтобы убедиться, что он подключается к базе данных и что нет проблем с подключением.

index.php

<?php 
    session_start();
    if (!isset($_SESSION["manager"])) {
        header("location: admin_login.php"); 
        exit();
    }
    // Be sure to check that this manager SESSION value is in fact in the database
    $managerID = preg_replace('#[^0-9]#i', '', $_SESSION["id"]); // filter everything but numbers and letters
    $manager = preg_replace('#[^A-Za-z0-9]#i', '', $_SESSION["manager"]); // filter everything but numbers and letters
    $password = preg_replace('#[^A-Za-z0-9]#i', '', $_SESSION["password"]); // filter everything but numbers and letters
    // Run mySQL query to be sure that this person is an admin and that their password session var equals the database information
    // Connect to the MySQL database  
    include "../scripts/connect_to_mysql.php"; 
    $sql = mysql_query("SELECT * FROM admin WHERE id='$managerID' AND username='$manager' AND password='$password' LIMIT 1"); // query the person
    // ------- MAKE SURE PERSON EXISTS IN DATABASE ---------
    $existCount = mysql_num_rows($sql); // count the row nums
    if ($existCount == 0) { // evaluate the count
        echo "Your login session data is not on record in the database.";
        exit();
    }
?>

Почему мой код может возвращать That information is incorrect, try again <a href="index.php">Click Here</a>'; вместо успешной проверки?

Ответы [ 3 ]

3 голосов
/ 15 августа 2011

Проблема (с?)

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

Проблема № 1: Вы используете REGEX для удаления своего кода.

Есть намного лучшие альтернативы, лучшиеиз которых подготовленные заявления , которые вы, очевидно, должны использовать.К сожалению, функции mysql_* не поддерживают это.Это заставляет меня перейти к следующей проблеме:

Проблема № 2: Вы используете mysql_* функции.

Вы не должны использовать такие функции, как mysql_query() и mysql_num_rows(), вместо этого,рассмотрите возможность перехода на более качественную и безопасную альтернативу, такую ​​как MySQLi (Хорошо) или PDO (Отлично).

Проблема № 2.5: вы не используете подготовленные операторы .

Подготовленный оператор автоматически экранируется, и любой вредоносный код или символы становятся бесполезными, то же самое относится и к инъекциям SQL.Вам следует использовать более качественный обработчик базы данных, который его поддерживает (см. Проблема №2).

Проблема №3: ​​Вы проводите специальное тестирование.

Вы, кажется, тестируете, только если число строк равноточно один.Но что, если есть (случайно) 2?Вместо проверки того, что должно быть, проверьте, что должно быть , а не :

if ($existCount != 0) { ...

Проблема № 4: Вы не выбираете правильные поля.

Вы выбираете толькоid поле в вашем запросе, где вместо этого вы должны выбрать все соответствующие поля (например, имя пользователя и пароль) для получения информации.

Проблема № 5: Вы не используете безопасное хранение.

Если бы кто-то украл вашу базу данных, у него был бы легкий доступ ко всем вашим паролям.Попробуйте использовать метод шифрования, такой как sha1().

Проблема № 6: Вы не проверяете ошибки.

Ошибки могут и будут возникать, вы должны проверить их, с mysql_query() вы, вероятно, должны сделать что-то вроде

mysql_query("SELECT....") or die(mysql_error());

В PDO это будет что-то вроде

if (!$stmt->execute()) { throw new Exception("Execution failed.` . var_export($stmt->errorInfo(), true)); }

Попробуйте исправить это и сообщите нам, если ваша проблемасохраняется.

Удачи:)

2 голосов
/ 15 августа 2011

Попробуйте сделать:

$sql = mysql_query("SELECT ... LIMIT 1") or die(mysql_error());

Ваш код предполагает, что запрос выполнен успешно, что является очень плохой формой.Всегда проверяйте наличие ошибок.Возможно, вам не удалось подключиться к базе данных.возможно, ваша БД повреждена, и у вас есть 2 или более записей с одним и тем же именем пользователя / паролем и т. д. ...

1 голос
/ 15 августа 2011

Я новичок в PHP, но заметил, что ваш оператор select в первом примере кода выбирает только id. Это может быть проблемой. Вы должны изменить его, чтобы выбрать * и посмотреть, если это имеет какое-либо значение.

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...