Я понимаю, что вы не можете использовать имена баз данных или таблиц в качестве параметров в подготовленных утверждениях. Однако наше приложение позволяет пользователю указать имя базы данных во время установки. Есть ли абстрактный или PDO способ указать эти имена (обратные метки для MySQL, скобки для MSSql и т. Д.)?
Вы не можете напрямую экранировать имена столбцов и таблиц в PDO. Вы можете увидеть ответ здесь:
экранирование имени столбца с помощью PDO
В этой ситуации вы можете сделать запрос, чтобы получить все таблицы из данной базы данных, например:
SHOW TABLES;
Или запросите, чтобы получить все базы данных, подобные этой:
SHOW DATABASES;
Затем используйте это как белый список для пользовательского ввода.
Когда вы используете базы данных, целесообразно исключить некоторые системные базы данных, такие как mysql
сам и information_schema
,
Другой вариант — отфильтровать пользовательский ввод с помощью заданного регулярного выражения, например, если имена вашей таблицы / базы данных — это только строки с подчеркиванием, вы можете использовать:
preg_match('/^[a-z_]+$/i', $userGivenTableName)
Это должно удалить все потенциальные строки, содержащие инъекции SQL.
Других решений пока нет …