PHP Что такое кодировка по умолчанию для pdo mysql - PullRequest
0 голосов
/ 01 сентября 2018

Я читал о внедрении MySQL второго порядка на этой странице Достаточно ли подготовленных операторов PDO для предотвращения внедрения SQL? .

, и это вызвало много вопросов о charset, и я не уверен, что мой код безопасен для инъекции MySQL

В моем коде я никогда не использую кодировку при выполнении запроса,

Я просто делаю

$pdo = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASSWORD, [PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_PERSISTENT => false]);
$stmt = $pdo->prepare("SELECT * FROM keywords  WHERE keyword_name = ? || keyword_name = ?");
$stmt->execute(["hello","world"]);
rows = $stmt->fetchAll();
// show the data on webpage
$pdo = null;

Я обнаружил, что есть два разных способа set charset в pdo

$pdo = new PDO("mysql:host=" . DB_HOST . ";charset=utf8;......);

и

$pdo->exec("set names utf8");

Согласно ответам @ircmaxell по этой ссылке Достаточно ли подготовленных операторов PDO для предотвращения внедрения SQL? . первый метод должен использоваться для защиты от SQL-инъекций второго порядка ...

Но у меня было never set charset в моих кодах (как показано в первом коде), поэтому у меня есть несколько вопросов

  1. для первого кода, в котором я не устанавливаю никакую кодировку, что будет набором символов по умолчанию и будет ли он безопасным?
  2. это связано с набором символов базы данных, для моей базы данных набор символов (Collation) равен ut8_general_ci (обнаружен в операциях phpmyadmin->)?
  3. является ли utf8 кодировка в сейфе для инъекций второго порядка, т.е. $pdo = new PDO("mysql:host=" . DB_HOST . ";charset=utf8;......); выполнена работа против всех видов MySQL инъекций?

1 Ответ

0 голосов
/ 04 сентября 2018

Параметр 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'";

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

...