Поскольку вы используете SqlConnection, предполагается, что это база данных SQL Server.
Исходя из этого предположения, вы можете проверять имена таблиц и полей с помощью регулярного выражения, которое следует правилам идентификатора SQL Server, как определено в MSDN . Хотя я полный и полный новичок в регулярных выражениях, я нашел этот, который должен быть ближе:
[\p{L}{\p{Nd}}$#_][\p{L}{\p{Nd}}@$#_]*
Однако регулярное выражение не будет адресовать ключевые слова SQL Server и не гарантирует, что таблица и / или столбец действительно существуют (хотя вы указали, что это не было большой проблемой).
Если бы это было мое приложение, я бы сначала убедился, что конечный пользователь не пытался выполнить инъекцию, отклонив любой запрос, содержащий точки с запятой (;).
Далее я бы проверил существование таблицы, удалив допустимые разделители имен (", ', [,]), разделив имя таблицы по периоду, чтобы увидеть, была ли указана схема, и выполнив запрос к INFORMATION_SCHEMA.TABLES. определить наличие таблицы.
Например:
SELECT 1
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'tablename'
AND TABLE_SCHEMA = 'tableschema'
Если вы создаете этот запрос с использованием параметров, вам следует дополнительно защитить себя от внедрения.
Наконец, я бы проверил существование каждого имени столбца, выполнив аналогичный набор шагов, используя только INFORMATION_SCHEMA.COLUMNS, чтобы определить достоверность столбца (столбцов), как только таблица будет определена как действительная.
Я бы, вероятно, выбрал список допустимых столбцов для этой таблицы из SQL Server, а затем проверил, что каждый столбец запроса был в списке в моем коде. Таким образом, вы сможете точно определить, в каких столбцах произошла ошибка, и предоставить эту обратную связь пользователю.