Обеспечение безопасности заявлений при извлечении

77
7

Я просто не понимаю. Как подготовленный оператор более безопасен, чем незаготовленный оператор для получения данных. Я не говорю о записи в базу данных, а только об извлечении данных. Я не вижу, как userFname и userLname более безопасны, чем userEmail и userPassword. Заранее спасибо.

$stmt = $mysqli->stmt_init();
if ($stmt->prepare("SELECT userFname, userLname FROM users WHERE userEmail = ? and userPassword = ?")) {
$stmt->bind_param("ss", $userEmail, $userPassword);
$stmt->execute();
$stmt->bind_result($userFname, $userLname);
while ($stmt->fetch()) {
//Remember first name, last name, and email
$_SESSION['Email']=$userEmail;
$_SESSION['Fname']=$userFname;
$_SESSION['Lname']=$userLname;
$stmt->close();
//go to dashboard page
header ("location: dashboard.php");
}
$error2="Email and Password do not match, please try again.";
}

спросил(а) 2021-01-25T19:56:47+03:00 4 месяца, 4 недели назад
1
Решение
107

Я инструктор по обучению для MySQL. Я рассказывал группе участников о рисках инъекции SQL, и один парень сказал: "Покажи мне".

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

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

Его приложение аутентифицировало мой фиктивный логин, и я был.

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

Но дело в том, что SQL-запрос SELECT-запроса может допускать незаконные действия, как и SQL-инъекция оператора, который изменяет данные.


Ваши комментарии к плохой информации:

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

Но параметры запроса работают только в тех местах, где вы обычно используете одну строку, дату или числовой литерал. Параметры запроса не могут использоваться для динамических имен таблиц, имен столбцов, списков значений, ключевых слов SQL, выражений и т.д. Для них вам все же необходимо интерполировать переменные приложения в ваш SQL-запрос перед вызовом prepare(), например, в старой школе, небезопасное программирование. Поэтому вам все равно нужно быть осторожным, чтобы избежать уязвимостей SQL-инъекций. Лучший способ сделать это - добавить белый список, прежде чем включать его в SQL-запросы.

См. Мою презентацию " Мифы о выбросах SQL" и "Ошибки" для получения дополнительной информации или веб-семинар, в котором я представляю его (бесплатно, но требует регистрации). Я также написал о SQL-инъекции в главе моей книги " Антипаттерны SQL: устранение ошибок программирования баз данных".

ответил(а) 2021-01-25T19:56:47+03:00 4 месяца, 4 недели назад
45

В области SQL-инъекции есть одна огромная Вавилонская башня.

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

Пример: 99% пользователей PHP скажут вам, что данные должны быть "экранированы". В то время как технически уход - это очень особенное действие, недостаточное для защиты в одном случае, когда оно бесполезно и вредно для другого.

То же самое относится и к любому другому слову из списка "дезинфекция", "фильтрация", "экранирование", "подготовленные заявления" и тому подобное.

Таким образом, образно говоря, каждый разговор превращается в спор между слепым и глухим.

Точно так же происходит для вещи, называемой "input input". Это еще один источник многих замешательств и - хуже того - уязвимости. Хотя в его самом очевидном значении он абсолютно не имеет никакого отношения к SQL-инъекции.

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

Вернемся к вашему вопросу, ответ довольно прост:

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

Эти правила довольно просто запомнить. Итак - не добавляйте в них никакой сложности! Не утруждайте себя вопросами: "Откуда взялись эти данные?" "В каком вопросе он идет?" - они бесполезны и подвержены ошибкам.

Следовать этим правилам не так просто, но это другая тема.

ответил(а) 2021-01-25T19:56:47+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема