Проверка PHP не работает, когда мы обрабатываем вошедший в систему процесс

У меня есть PHPсайт. Я хочу создать signup-login process. Я завершил процесс signup, но когда мне log in мне нужно будет выполнить некоторую проверку, только после этого он должен быть перенаправлен на страницу, на которую я хочу, чтобы он был перенаправлен.

У меня есть следующие страницы:

index.php,
login.php,
handleLogin.php, and
blog.php

Я хочу выполнить такую ​​проверку, когда мы входим в систему с index.php или любой другой страницы, но не со страницы blog, в login будет ссылка с именем header, и когда кто-то захочет щелкнуть оттуда, появится страница login и после logged in произойдет перенаправление на index.php. Но когда мы нажимаем с comment на страницу blog, сначала происходит перенаправление на страницу login, а в случае успеха logged in происходит перенаправление на страницу sameblog.

Ниже приведены коды HTML страницы login:

<div class = "login_form">
    <form action = "handleLogin.php" method = "POST" class = "login">
        <div class = "mb-3">
            <label for = "exampleInputEmail1" class = "form-label">Email address</label>
            <input type = "email" name = "vEmail" class = "form-control" id = "exampleInputEmail1" aria-describedby = "emailHelp">
        </div>

        <div class = "mb-3">
            <label for = "exampleInputPassword1" class = "form-label">Password</label>
            <input type = "password" name = "vPass" class = "form-control" id = "exampleInputPassword1">
            <div id = "emailHelp" class = "form-text">We'll never share your email & password with anyone else.</div>
        </div>

        <button type = "submit" class = "btn btn-primary mb-3">Log in</button>

        <div class = "create_account">
            <label for = "exampleInputEmail1" class = "form-label">Don’t have an account? <a href = "signup.php"
                    class = "signup_link">Sign up</a></label>
        </div>
    </form>
</div>

Ниже приведены коды HTML страницы handleLogin:

<?php
// session_start ();
// $bid = $_GET['b'];
$bid = '0';

$showAlert = "false";
if ($_SERVER["REQUEST_METHOD"]= = "POST"){
    include '../partials/_dbconnect.php';

    $viewerEmail = $_POST['vEmail'];
    $viewerPass = $_POST['vPass'];

    $loginSql = "SELECT * FROM `viewers` WHERE `viewer_email`='$viewerEmail'";
    $loginResult = mysqli_query($conn, $loginSql);
    $loginNumRows = mysqli_num_rows($loginResult);

    if ($loginNumRows==1) {
        $showAlert = "Password not match";

        $loginRow = mysqli_fetch_assoc($loginResult);
        if (PASSWORD_VERIFY($viewerPass, $loginRow['viewer_pass'])) {

            session_start();
            $_SESSION['loggedin'] = true;
            $_SESSION['vid'] = $row['viewer_id'];
            $_SESSION['viewer_email'] = $row['viewer_email'];
            $_SESSION['viewer_name'] = $row['viewer_name'];

            // start
            $showAlert = "No authority";
            if (isset($_SESSION['loggedin']) && $_SESSION['loggedin']==true) {
                // header("Location: ../mains/blog?logininsuccess=true&b=$bid");
                // exist();
                if (($bid!=0) && ($bid!=NULL)) {
                    header("Location: ../mains/blog?logininsuccess=true&b=$bid");
                    exist();
                }
                else {
                    // header("Location: ../index");
                    // exist();
                    $showAlert = "No bid";
                    if (isset($_SESSION['loggedin']) && $_SESSION['loggedin']==true) {
                        
                        $showAlert = "Unknown bid";
                        if (($bid=0) && ($bid=NULL) && ($bid='')) {
                            header("Location: ../index?no_bid");
                            exist();
                        }
                        else {
                            header("Location: login?loginsuccess=false&error=$showAlert");
                        }
                    }
                    else {
                        header("Location: login?loginsuccess=false&error=$showAlert");
                    }
                }
            }
            else {
                header("Location: login?loginsuccess=false&error=$showAlert");
            }
            // end
        }
    }
    else {
        $showAlert = "Email not exist";
    }
    header("Location: login?loginsuccess=false&error=$showAlert");
}
?>

Результат, который я получаю, следующий:

loginsuccess=false&error=Unknown%20bid

Ожидаемый мной результат следующий:

Когда $bid='0' или $bid='NULL' или $bid='' или нет $bid, то после logged in стоит successful, он должен перенаправить на index.php, но если $bid='5', то он должен перенаправить на http://localhost/ows-backup-30-7-24/mains/blog?b=5

Ваш код открыт для SQL-инъекций

DarkBee 12.08.2024 13:44
if (($bid=0) && ($bid=NULL) && ($bid='')) { - Это не то, что вы думаете... Пожалуйста, посмотрите = vs. ==
DarkBee 12.08.2024 13:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не могли бы вы попробовать это

 <?php
    session_start(); // Ensure session is started at the beginning

    if ($_SERVER["REQUEST_METHOD"] == "POST") {
        include '../partials/_dbconnect.php';

        $viewerEmail = $_POST['vEmail'];
        $viewerPass = $_POST['vPass'];

        $loginSql = "SELECT * FROM `viewers` WHERE `viewer_email`='$viewerEmail'";
        $loginResult = mysqli_query($conn, $loginSql);

        if ($loginResult) {
            $loginRow = mysqli_fetch_assoc($loginResult);
            if (password_verify($viewerPass, $loginRow['viewer_pass'])) {
                $_SESSION['loggedin'] = true;
                $_SESSION['vid'] = $loginRow['viewer_id'];
                $_SESSION['viewer_email'] = $loginRow['viewer_email'];
                $_SESSION['viewer_name'] = $loginRow['viewer_name'];

                // Determine where to redirect based on $bid
                if (isset($_GET['b']) && ($_GET['b'] == '0' || $_GET['b'] == NULL || $_GET['b'] == '')) {
                    header("Location: ../index.php");
                    exit();
                } else if (isset($_GET['b'])) {
                    $bid = $_GET['b'];
                    header("Location: ../mains/blog.php?b=$bid");
                    exit();
                } else {
                    // Default redirect if $bid is not set or invalid
                    header("Location: ../index.php");
                    exit();
                }
            } else {
                $showAlert = "Password does not match";
            }
        } else {
            $showAlert = "Email not found";
        }

        // Redirect with error message
        header("Location: login.php?loginsuccess=false&error = " . urlencode($showAlert));
        exit();
    } 
?>

это показывает мне ошибку Password does not match. Я вставил новые данные, и мне показывает ту же ошибку.

ravi kumar 12.08.2024 13:35

Пожалуйста, объясните, как эта стена кода решит проблему. Ответы, содержащие только код, не являются хорошими ответами - Как ответить

DarkBee 12.08.2024 13:43
Ответ принят как подходящий

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

В вашем скрипте есть ряд проблем:

1. SQL-инъекция

$viewerEmail = $_POST['vEmail']; 
$viewerPass = $_POST['vPass'];

$loginSql = "SELECT * FROM `viewers` WHERE `viewer_email`='$viewerEmail'";

Переменная $viewerEmail никогда не экранируется, и злоумышленники могут этим воспользоваться.

Используйте следующее, чтобы обеспечить безопасность использования в запросе к базе данных:

$viewerEmail = mysqli_real_escape_string($conn, $_POST['vEmail']);

2. Присвоение, а не сравнение

if (($bid=0) && ($bid=NULL) && ($bid='')) {
   header("Location: ../index?no_bid");
   exist();
}

Вышеупомянутое устанавливает $bid на 0 и оценивает ложно. Это означает, что он никогда не будет выполнен. Вместо этого используйте empty($bid), так как он делает то, что вы хотите. Например:

if (empty($bid)) {
    header("Location: ../index?no_bid");
    exist();
}

3. Опечатка

$loginRow = mysqli_fetch_assoc($loginResult);
...
$_SESSION['vid'] = $row['viewer_id'];
$_SESSION['viewer_email'] = $row['viewer_email'];
$_SESSION['viewer_name'] = $row['viewer_name'];

Переменная $row никогда не определяется, ее следует обновить до $loginRow.

Рекомендуемое решение

Это более чистая версия вашего скрипта, которая может помочь все объяснить немного лучше:

<?php
/* only handle post requests */
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    exit();
}

/**
 * Require database connection
 * @var mysqli $conn
 */
require '../partials/_dbconnect.php';

/* Get possible request parameters */
$viewerEmail = $_POST['vEmail'];
$viewerPass = $_POST['vPass'];
$bid = $_GET['b'] ?? 0; // optionally set the bid

/* Fetch viewer from database */
$loginSql = "SELECT * FROM `viewers` WHERE `viewer_email`= ?";
$loginStmt = $conn->prepare($loginSql);
$loginStmt->bind_param('s', $loginEmail);
$loginEmail = $viewerEmail;
if (!$loginStmt->execute()) {
    $error = urlencode('An error occurred');
    header("Location: login?loginsuccess=false&error = {$error}");
    exit();
}
$loginResult = $loginStmt->get_result();
$loginStmt->close();

/* Check if we got a user */
if (!$loginResult || $loginResult->num_rows < 1) {
    $error = urlencode('Email not exist');
    header("Location: login?loginsuccess=false&error = {$error}");
    exit();
}

/* Get the user details */
$loginRow = $loginResult->fetch_assoc();
$loginResult->free();
if (!$loginRow) {
    $error = urlencode('Email not exist');
    header("Location: login?loginsuccess=false&error = {$error}");
    exit();
}

/* verify the password */
if (!password_verify($viewerPass, $loginRow['viewer_pass'])) {
    header("Location: login?loginsuccess=false&error=false");
    exit();
}

/* Start and set login session data */
session_start();
$_SESSION['loggedin'] = true;
$_SESSION['vid'] = $loginRow['viewer_id'];
$_SESSION['viewer_email'] = $loginRow['viewer_email'];
$_SESSION['viewer_name'] = $loginRow['viewer_name'];

/* If for some reason the user is not logged in exit */
if (empty($_SESSION['loggedin'])) {
    $error = urlencode('No authority');
    header("Location: login?loginsuccess=false&error = {$error}");
    exit();
}

/* If we have a bid, redirect to the blog */
if (!empty($bid)) {
    header("Location: ../mains/blog?logininsuccess=true&b = {$bid}");
    // exist();
    exit();
}

/* If we get here, there is no bid and we can redirect to index */
header("Location: ../index?no_bid");
// exist();
exit();

Правки

  • Добавьте подготовленное заявление.
  • Использование интерфейса ООП.
mysqli_real_escape_string() не следует рекомендовать. Им следует использовать подготовленные операторы с параметрами для защиты от SQL-инъекций.
Barmar 13.08.2024 02:23

Другая проблема с оператором if заключается в том, что им следует использовать ||, а не &&.

Barmar 13.08.2024 02:24

@Jarryd Спасибо, брат. Я буду помнить ваши вещи в будущем, когда буду писать SQL запросы.

ravi kumar 13.08.2024 06:54

@Barmar Спасибо за пересмотр запросов. Мне также было интересно, почему они использовали || вместо &&. Еще хочу знать, что написать вместо mysqli_real_escape_string().

ravi kumar 13.08.2024 07:04

Другие вопросы по теме