PDO читает базу данных, но не входит в систему - PullRequest
0 голосов
/ 19 марта 2019

В настоящее время у меня есть система входа в систему, которую я хотел бы преобразовать в PDO из Mysqli.

В настоящее время у меня есть веб-сайт с базой данных, прикрепленной с помощью phpMyAdmin / MySQL.

Я попытался преобразовать все, и теперь я покажу вам часть системы LOGIN.php, так как я еще не коснулся части регистрации.

Это то, что у меня есть.

LOGIN.INC.PHP

    <?php

require_once 'dbh.inc.php';

try {
    $handler = new PDO("mysql:host=$servername;dbname=$dbname",
    $username,
    $password,
    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
  } catch(PDOException $e){
    echo $e->getName();
    die();
  }

//first we start a session
session_start();

//We then check if the user has clicked the login button
if (isset($_POST['submit'])) {

    //Then we require the database connection
    //require_once 'dbh.inc.php';
    //And we get the data from the login form
    $name = $_POST['name'];
    $password = $_POST['password'];

    //Error handlers
    //Error handlers are important to avoid any mistakes the user might have made when filling out the form!
    //Check if inputs are empty
    if (empty($name) || empty($password)) {
        header("Location: ../index.php?login=empty");
        exit();
    }   
    } else {
        $stmt = $db->prepare("SELECT * FROM users WHERE user_name=:name");
        $stmt->bindParam(':name', $name, PDO::PARAM_STR);

        if ($stmt->execute()) {
            header("location: ../index.php?login=error");
            exit();
        } else { 
            if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            //de-hashing the password
            $hashedpasswordCheck = password_verify($password, $row['user_password']);
            if ($hashedpasswordCheck == false) {
              header("location: ../index.php?login=error");
              exit();

            } elseif ($hashedpasswordCheck == true) {
                //Log in the user here
                $_SESSION['u_id'] = $row['user_id'];
                $_SESSION['u_name'] = $row['user_name'];
                header("location: ../index.php?login=success");
                exit();
              }
            } else {
                header("location: ../index.php?login=error");
                exit();
              }     
        }  
      } 

DBH.INC.PHP

    <?php

$servername = "localhost";
$username = "root";
$password = "";
$dbname = "loginsystem";


try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname",
    $username,
    $password,
    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

    $stmt = $conn->prepare("SHOW DATABASES;");

    $stmt->execute();
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $result = $stmt->fetchAll();
    print_r($result);


}
catch(PDOException $e) {
    echo $e->getMessage();
}

$conn = null;

Когда я пытаюсь войти в систему, меня перенаправляют на этот URL:

http://localhost/php44/includes/login.inc.php

и получите это распечатанное сообщение / ошибка.

Array ([0] => Array ([База данных] => imgupload) [1] => Массив ([База данных] => information_schema) [2] => Массив ([База данных] => Логическая система) [3] => Массив ([База данных] => mysql) [4] => Массив ([База данных] => performance_schema) [5] => Массив ([База данных] => phpmyadmin) [6] => Массив ([База данных] = > тест))

Что мне сделать, чтобы это исправить, чтобы мой логин работал?

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Ваш код уязвим для Внедрение элементов HTML и атака с фиксацией сеанса . Я реализовал strip_tags(), чтобы предотвратить атаку внедрения html-элементов, а также session_regenerate_id();, чтобы предотвратить атаку с фиксацией сеанса.

Опять же, поскольку вы вошли в систему, вам нужно только инициализировать сеанс, как только имя пользователя и пароль проверены.

Что касается меня, я предпочитаю использовать метод массива PDO. Во всяком случае, я предоставил два решения. Сначала я работаю над вашим кодом, а затем изменяю его. Убедитесь, что учетные данные базы данных в порядке

Ваш код

<?php

//db connect starts
$db = new PDO (
    'mysql:host=localhost;dbname=loginsystem;charset=utf8', 
    'root', // username

    '' // password
);



//We then check if the user has clicked the login button
if (isset($_POST['submit'])) {
    $name = $_POST['name'];
    $password = $_POST['password'];

    if ($name =='' && $password =='') {
        header("Location: ../index.php?login=empty");
        exit();
    } 


        $stmt = $db->prepare("SELECT * FROM users WHERE user_name=:name");
        $stmt->bindParam(':name', $name, PDO::PARAM_STR);
        $stmt->execute();

$count = $stmt->rowCount();
if( $count == 1 ) {
$row = $stmt->fetch();
if(password_verify($password,$row['password'])){
            echo "Password verified and ok";

// initialize session if things where ok.
session_start();

//Prevent session fixation attack
session_regenerate_id();

$_SESSION['u_id'] = $row['user_id'];
$_SESSION['u_name'] = $row['user_name'];
header("location: ../index.php?login=success");
exit();


        }
        else{
            echo "Wrong Password details";
        }
}
else {

echo "User does not exist";
}
}
?>

мой код

<?php

//if (isset($_POST['submit'])) {
if ($_POST['name'] !='' && $_POST['password']) {

//connect 
$db = new PDO (
    'mysql:host=localhost;dbname=loginsystem;charset=utf8', 
    'root', // username

    '' // password
);

$name = strip_tags($_POST['name']);
$password = strip_tags($_POST['password']);

if ($name == ''){
echo "Username is empty";
exit();
}
if ($password == ''){
echo "password is empty";
exit();
}

$result = $db->prepare('SELECT * FROM users where user_name = :name');
        $result->execute(array(
            ':user_name' => $name));
$count = $result->rowCount();
if( $count == 1 ) {
$row = $result->fetch();

  if(password_verify($password,$row['password'])){
            echo "Password verified and ok";

// initialize session if things where ok.
session_start();

//Prevent session fixation attack
session_regenerate_id();

$_SESSION['u_id'] = $row['user_id'];
$_SESSION['u_name'] = $row['user_name'];
header("location: ../index.php?login=success");
exit();


        }
        else{
            echo "Wrong Password details";
        }
}
else {

echo "User does not exist";
}

}

?>
0 голосов
/ 19 марта 2019

Я сделал несколько исправлений и добавил комментарии, чтобы объяснить, что изменилось:

LOGIN.INC.PHP

<?php

//First we start a session
session_start();

//Then we require the database connection
require_once 'dbh.inc.php';

// Removed the extra database connection here.

//We then check if the user has clicked the login button
if (isset($_POST['submit'])) {

    //And we get the data from the login form
    $name = $_POST['name'];
    $password = $_POST['password'];

    //Error handlers
    //Error handlers are important to avoid any mistakes the user might have made when filling out the form!
    //Check if inputs are empty
    if (empty($name) || empty($password)) {
        header("Location: ../index.php?login=empty");
        exit();
    }   
//Removed extra 'else' here.
    $stmt = $conn->prepare("SELECT * FROM users WHERE user_name=:name");  // Changed $db to $conn to use the connection from DBH.INC.PHP
    $stmt->bindParam(':name', $name, PDO::PARAM_STR);

    if (!$stmt->execute()) {   // Added the ! to say "if this doesn't work, redirect to error"
        header("location: ../index.php?login=error");
        exit();
    } else { 
        if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            //de-hashing the password
            $hashedpasswordCheck = password_verify($password, $row['user_password']);
            if ($hashedpasswordCheck == false) {
                header("location: ../index.php?login=error");
                exit();
            } else if ($hashedpasswordCheck == true) {
                //Log in the user here
                $_SESSION['u_id'] = $row['user_id'];
                $_SESSION['u_name'] = $row['user_name'];
                header("location: ../index.php?login=success");
                exit();
            }
        } else {
        header("location: ../index.php?login=error");
        exit();
        }     
    }  
}

DB.INC.PHP

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "loginsystem";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname",
    $username,
    $password,
    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

    // Removed the query and print of the databases

  }
catch(PDOException $e) {
    echo $e->getMessage();
}
// Removed the $conn=null to keep the connection we just set up.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...