Услуги
Заказы
Эксперты
Магазин
Портфолио
Журнал
Справочник
FAQ
Контакты
Услуги
Заказы
Эксперты
Магазин
Портфолио
Журнал
Справочник
Вопросы
FAQ
Контакты
Авторизация
Ничего не найдено
Найти
Разберите уязвимый к SQL-инъекции код на PHP/Node/Java и перепишите безопасный вариант с подготовленным выражением и параметризацией, объясните, почему подготовленные выражения нейтрализуют инъекции
Предыдущий
вопрос
Следующий
вопрос
Главная
Вопросы и ответы
Вопросы и ответы по программированию
Разберите уязвимый к...
Ответить
Получить ответ за 25 ₽
Задать свой вопрос
eva
3 Фев в 13:33
14
+1
0
Ответы
1
Helper
Helper
PHP — уязвимый:
```php
<?php
// уязвимо: прямая конкатенация входа в SQL
$id = $_GET['id'];
$conn = new mysqli("
localhost
", "user", "pass", "db");
$sql = "SELECT * FROM users WHERE id = $id";
$result = $conn->query($sql);
?> ```
PHP — безопасный (mysqli, подготовленное выражение):
```php
<?php
$id = $_GET['id'];
$conn = new mysqli("
localhost
", "user", "pass", "db");
$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $id); // "i" — integer
$stmt->execute();
$result = $stmt->get_result();
?> ```
Node.js — уязвимый (mysql, конкатенация):
```js
// уязвимо: конкатенация значения в строку запроса
const mysql = require('mysql');
const conn = mysql.createConnection({...});
const username = req.body.username;
const sql = "SELECT * FROM users WHERE username = '" + username + "'";
conn.query(sql, (err, rows) => { ... });
```
Node.js — безопасный (mysql2 / mysql с параметрами):
```js
const mysql = require('mysql2');
const conn = mysql.createConnection({...});
const username = req.body.username;
conn.execute('SELECT * FROM users WHERE username = ?', [username], (err, rows) => { ... });
```
Java — уязвимый (Statement, конкатенация):
```java
// уязвимо
String email = request.getParameter("email");
Statement st = conn.createStatement();
String sql = "SELECT * FROM users WHERE email = '" + email + "'";
ResultSet rs = st.executeQuery(sql);
```
Java — безопасный (PreparedStatement):
```java
String email = request.getParameter("email");
PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE email = ?");
ps.setString(1, email);
ResultSet rs = ps.executeQuery();
```
Краткое объяснение, почему подготовленные выражения нейтрализуют инъекции:
- Подготовленное выражение разделяет структуру запроса и данные: сначала сервер СУБД получает запрос с плейсхолдерами и строит/компилирует план выполнения, затем значения параметров передаются отдельно как данные. Поэтому даже если параметр содержит фрагмент SQL (например, `"' OR 1=1 --"`), СУБД трактует это как строковое значение, а не как часть кода запроса.
- Параметризация обеспечивает корректное экранирование/привязку типов (числа, строки, даты), что дополнительно предотвращает изменение синтаксиса запроса.
- Замечание: подготовленные выражения не решают проблему подстановки динамических идентификаторов (имён таблиц/столбцов). Для этого используйте белый список разрешённых имён и строгую валидацию/привилегии.
Рекомендации: всегда использовать подготовленные выражения для пользовательских данных, минимизировать привилегии БД и валидировать/санитизировать вход, особенно при динамической генерации частей SQL.
Ответить
3 Фев в 13:40
Спасибо
Похожие вопросы
Есть ли API для Хабр? Здраствуйте, иммется такой вопрос, имеете ли хабр api для автопубликации статей от профиля…
eva
Программирование
30 Июл
0
Ответить
Сравните подходы сериализации данных (JSON, Protobuf, MessagePack, XML) по скорости, размерам, расширяемости…
eva
Программирование
28 Июл
1
Ответить
Составьте чек-лист для проведения код-ревью, включающий стилистические, архитектурные, производительные…
eva
Программирование
28 Июл
1
Ответить
Показать ещё
Другие вопросы
eva
Показать ещё
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Тип работы
Задача
Контрольная
Курсовая
Лабораторная
Дипломная
Реферат
Практика
Тест
Чертеж
Сочинение
Эссе
Перевод
Диссертация
Бизнес-план
Презентация
Билеты
Статья
Доклад
Онлайн-помощь
Рецензия
Монография
ВКР
РГР
Маркетинговое исследование
Автореферат
Аннотация
НИР
Докторская диссертация
Магистерская диссертация
Кандидатская диссертация
ВАК
Scopus
РИНЦ
Шпаргалка
Дистанционная задача
Творческая работа
Разместить заказ
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Задача
Контрольная работа
Курсовая работа
Лабораторная работа
Дипломная работа
Реферат
Отчет по практике
Тест
Чертеж
Сочинение
Эссе
Перевод
Диссертация
Бизнес-план
Презентация
Ответы на билеты
Статья
Доклад
Онлайн-помощь
Рецензия
Монография
ВКР
РГР
Маркетинговое исследование
Автореферат
Аннотация
НИР
Докторская диссертация
Магистерская диссертация
Кандидатская диссертация
ВАК
Scopus
РИНЦ
Шпаргалка
Дистанционная задача
Творческая работа
Заказать
Прямой эфир
```php
<?php
// уязвимо: прямая конкатенация входа в SQL
$id = $_GET['id'];
$conn = new mysqli("localhost", "user", "pass", "db");
$sql = "SELECT * FROM users WHERE id = $id";
$result = $conn->query($sql);
?> ```
PHP — безопасный (mysqli, подготовленное выражение):
```php
<?php
$id = $_GET['id'];
$conn = new mysqli("localhost", "user", "pass", "db");
$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $id); // "i" — integer
$stmt->execute();
$result = $stmt->get_result();
?> ```
Node.js — уязвимый (mysql, конкатенация):
```js
// уязвимо: конкатенация значения в строку запроса
const mysql = require('mysql');
const conn = mysql.createConnection({...});
const username = req.body.username;
const sql = "SELECT * FROM users WHERE username = '" + username + "'";
conn.query(sql, (err, rows) => { ... });
```
Node.js — безопасный (mysql2 / mysql с параметрами):
```js
const mysql = require('mysql2');
const conn = mysql.createConnection({...});
const username = req.body.username;
conn.execute('SELECT * FROM users WHERE username = ?', [username], (err, rows) => { ... });
```
Java — уязвимый (Statement, конкатенация):
```java
// уязвимо
String email = request.getParameter("email");
Statement st = conn.createStatement();
String sql = "SELECT * FROM users WHERE email = '" + email + "'";
ResultSet rs = st.executeQuery(sql);
```
Java — безопасный (PreparedStatement):
```java
String email = request.getParameter("email");
PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE email = ?");
ps.setString(1, email);
ResultSet rs = ps.executeQuery();
```
Краткое объяснение, почему подготовленные выражения нейтрализуют инъекции:
- Подготовленное выражение разделяет структуру запроса и данные: сначала сервер СУБД получает запрос с плейсхолдерами и строит/компилирует план выполнения, затем значения параметров передаются отдельно как данные. Поэтому даже если параметр содержит фрагмент SQL (например, `"' OR 1=1 --"`), СУБД трактует это как строковое значение, а не как часть кода запроса.
- Параметризация обеспечивает корректное экранирование/привязку типов (числа, строки, даты), что дополнительно предотвращает изменение синтаксиса запроса.
- Замечание: подготовленные выражения не решают проблему подстановки динамических идентификаторов (имён таблиц/столбцов). Для этого используйте белый список разрешённых имён и строгую валидацию/привилегии.
Рекомендации: всегда использовать подготовленные выражения для пользовательских данных, минимизировать привилегии БД и валидировать/санитизировать вход, особенно при динамической генерации частей SQL.