Параметр character_set_client
- это то, что MySQL использует для набора символов запросов и данных, которые отправляет клиент.
По умолчанию utf8 в MySQL 5.5, 5.6 и 5.7 и utf8mb4 в 8.0.
Его также можно изменить глобально в файле опций my.cnf или за сеанс с помощью оператора SET NAMES .
Хорошо устанавливать опцию явно при подключении, поэтому вам не нужно принимать значение по умолчанию.
Ваш комментарий:
Боюсь, вы путаете два разных случая внедрения SQL. Существует риск при использовании этих пяти наборов символов, но он не связан с внедрением SQL второго порядка.
Риск набора символов связан с некоторыми многобайтовыми наборами символов. Обычно используется обратная косая черта для экранирования буквального символа кавычки. Но в некоторых наборах символов байт обратной косой черты объединяется с предыдущим байтом, образуя многобайтовый символ. Это оставляет цитату без тени.
SQL-инъекция второго порядка совершенно другая. Это может произойти с любым набором символов. Это когда злоумышленник добавляет данные в вашу базу данных законными способами, такими как заполнение формы. Вставка данных обрабатывается без ошибок. Но значения, которые они вставляют, содержат синтаксис, предназначенный для использования некоторых последующих SQL-запросов.
Он полагается на то, что разработчики считают, что данные, которые уже были безопасно сохранены в их базе данных, как-то «безопасны» для использования без надлежащей параметризации.
Примером SQL-инъекции второго порядка, которая является просто случайной, а не злонамеренной, может быть то, что человек имеет фамилию «O'Reilly», и имя читается кодом и используется в последующем запросе.
$name = $db->query("SELECT last_name FROM people WHERE id = 123")->fetchColumn();
$sql = "SELECT * FROM accounts WHERE account_owner_last_name = '$name'";
Если имя содержит буквальный апостроф, это приведет к путанице со вторым запросом в этом примере.