Как разрешить пользователю задавать собственные запросы в MySQL?

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

Например, если пользователь вводит запрос "count > 1 AND Name = Dima OR name = Andrey" в поле ввода, функция должна преобразовать его в "SELECT * FROM database WHERE count > 1 AND Name = Dima OR name = Andrey", предотвращая возможные инъекции SQL.
  • 16 сентября 2023 г. 10:37
Ответы на вопрос 2
Разрешение пользователю задавать собственные запросы в MySQL может быть достигнуто путем создания отдельного пользователя в базе данных MySQL с ограниченными правами доступа только к нужным таблицам и операциям.

Для этого выполните следующие шаги:

1. Войдите в MySQL с учетными данными администратора:

```
mysql -u root -p
```

2. Создайте нового пользователя с командой `CREATE USER`:

```sql
CREATE USER 'имя_пользователя'@'localhost' IDENTIFIED BY 'пароль';
```

3. Предоставьте этому пользователю права доступа к базе данных:

```sql
GRANT SELECT, INSERT, UPDATE, DELETE ON имя_базы_данных.* TO 'имя_пользователя'@'localhost';
```

Вы можете указать любые другие необходимые операции (например, CREATE, ALTER, DROP) вместо SELECT, INSERT, UPDATE, DELETE, а также заменить имя_базы_данных на имя реальной базы данных, к которой пользователь будет иметь доступ.

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

Что касается безопасной обработки пользовательского ввода и предотвращения инъекций SQL, то хорошим подходом является использование подготовленных SQL-запросов или ORM-библиотек, которые автоматически обрабатывают пользовательский ввод, экранируя специальные символы и предотвращая инъекции SQL.
 
Пример кода на языке PHP с использованием подготовленных SQL-запросов:

```php
$mysqli = new mysqli("хост", "имя_пользователя", "пароль", "имя_базы_данных");

$query = "SELECT * FROM database WHERE count > ? AND Name = ? OR name = ?";
$stmt = $mysqli->prepare($query);

$count = 1;
$name1 = "Dima";
$name2 = "Andrey";

$stmt->bind_param("iss", $count, $name1, $name2);
$stmt->execute();

$result = $stmt->get_result();

while ($row = $result->fetch_assoc()) {
    // Действия с каждой строкой результата
}

$stmt->close();
$mysqli->close();
```

В этом примере переменные, вводимые пользователем, передаются в запрос через привязку параметров (bind_param) с использованием подготовленного выражения. Это позволяет избежать инъекций SQL, поскольку значения переменных будут автоматически экранироваться.
1. Классифицировать хотелки пользователя и преобразовать их в набор формочек. Например:
    - Количество: ___
    - Названия: ___
   Транслировать их в фиксированные запросы, наподобие:
   SELECT * FROM база_данных WHERE количество > _ AND Название IN (___,___)

2. Предоставить пользователю конструктор запросов, где он может создавать фильтры и предикаты по своему усмотрению. Например, можно использовать подобные решения:
   - jOOQ (https://www.jooq.org/)
   - Querydsl (querydsl.com)

3. Учтите, что другие варианты, возможно, превышают ваши текущие навыки и опыт. Например, создание полноценной защиты от инъекций требует глубокого знания баз данных и синтаксических парсеров, а также постоянного обновления, чтобы учитывать новые угрозы и тренды в DBMS.

*Ссылки на jOOQ и Querydsl оставляю без изменений для удобства пользователя.*
Похожие вопросы