Почему мой код НЕ уязвим для SQL-инъекций?

Попытка создать простое приложение PHP, уязвимое для SQL-инъекции. Если пользователь / пароль правильный, это позволяет мне войти в систему, если нет, это не так. Однако, когда я пробую любое из них:

' OR '1' = '1

' OR '1'='1

' OR '1' = '1' --

появляется следующее сообщение об ошибке:

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given on line 14

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given on line 15

Я попытался ввести в оба поля и использовать действительные комбинации имени пользователя / инъекции и инъекции / действительного пароля, но безрезультатно. Может кто-нибудь указать на проблему? Спасибо. Код:

<!-- index.php -->

<?php
include("config.php");
session_start();
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if (isset($_POST["sbm"])){
        $username = $_POST['username'];
        $password = $_POST['password']; 
    }

    $sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
    $result = mysqli_query($conn,$sql);
    $row = mysqli_fetch_array($result);
    $count = mysqli_num_rows($result);

    if ($count == 1) {
        $_SESSION['login_user'] = $username;
        header("location: welcome.php");
    }
}
?>

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <form method = "post">
        <label>Username</label><input type = "text" name = "username"/><br /><br />
        <label>Password</label><input type = "password" name = "password"/><br/><br />
        <input type = "submit" value = "Login" name = "sbm"/><br />
    </form>
</body>
</html>

<!-- config.php -->

<?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_DATABASE', 'db');
$conn = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);
?>

<!-- welcome.php -->

<html>
<head>
    <title>Welcome</title>
</head>
<body>
    <h1>Welcome</h1> 
</body>
</html>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
2
0
642
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Классический способ SQL-инъекции:

Query: SELECT * FROM Users WHERE username='$username' AND password='$password'

вставьте следующее для значений имени пользователя и пароля:

$ username = 1 'или' 1 '=' 1 а также $ password = 1 'или' 1 '=' 1.

Затем запрос гласит:

SELECT * FROM Users WHERE username='1' OR '1' = '1' AND password='1' OR '1' = '1' 

Запрос возвращает значение (или значения), потому что условие всегда истинно (ИЛИ 1 = 1).

спасибо за подсказку, это сработало отлично! также спасибо всем участникам обсуждения за потраченное время и предложения.

Riwi 29.05.2018 22:28

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