PDA

Просмотр полной версии : [Вопрос] Проблема при отправке запроса



PawnoNoob
07.06.2020, 22:24
Всем привет. При подсчёте размера форматируемой строки (https://pro-pawn.ru/showthread.php?13388-%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82-%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0-%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D0%B9-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8) MySQL запроса столкнулся с небольшой проблемой.

Выглядит это примерно так:

static const fmt_str[] = "SELECT `ID` FROM `acc` WHERE `Name` = '%e' LIMIT 1";
new string[sizeof(fmt_str) + (-2+MAX_PLAYER_NAME)];
format(string, sizeof(string), fmt_str, inputtext);
mysql_tquery(mysql, string, !"search_id", "is", playerid, inputtext);


При выводе запроса в консоль (printf) я вижу, что он выглядит так:

SELECT `ID` FROM `acc` WHERE `Name` = 'e' LIMIT 1

При этом с %s всё работает нормально. В чём проблема?
Версия MySQL: R41-4

tnc
07.06.2020, 22:29
В том, что Вы используйте format, а нужно mysql_format. Можно использовать format с спецификатором %q.
Тут более подробнее (https://wiki.pro-pawn.ru/wiki/%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D1%82%D1%80%D0%BE%D0%BA)

DeimoS
13.06.2020, 11:58
В том, что Вы используйте format, а нужно mysql_format. Можно использовать format с спецификатором %q.
Тут более подробнее (https://wiki.pro-pawn.ru/wiki/%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D1%82%D1%80%D0%BE%D0%BA)

На самом деле %q для MySQL не подойдёт, ибо этот спецификатор экранирует только апостроф ', а графис ` и обратный слэш \ пропускает.

Вообще в запросе автора экранировать данные особо смысла нет, ибо сам клиент не пустит игрока на сервер с символами, через которые можно создать SQL-инъекцию.

А если это делается на случай какого-то бага SA-MP, который вдруг позволит вводить любые символы в любых количествах, то для подобного нужно делать проверку ника перед подключением игрока, а не пихать экранирование в запросы. Ибо есть куча вариантов того, как можно будет навредить серверу при помощи ника похлеще, чем SQL-инъекциями: начиная от каких-то внутренних багов SA-MP, по типу "%s" в нике, и заканчивая ником по типу "../samp-server", который создаст ошибку при чтении сервером командной строки.