Разобрать оператор SQL, чтобы увидеть, является ли он чем-то другим, чем оператор SELECT? - PullRequest
1 голос
/ 09 ноября 2010

Есть ли хороший способ проанализировать инструкцию SQL, чтобы убедиться, что она содержит только инструкцию SELECT и ничего больше? Я использую C #, System.Data.SqlConnection и MS SQL Server

Ответы [ 5 ]

6 голосов
/ 09 ноября 2010

Вы должны подключиться к базе данных как пользователь, у которого нет прав на какие-либо действия, кроме SELECT.

Таким образом, любой оператор, не являющийся SELECT, не сможет быть выполнен.

Это наиболее безопасное из возможных решений, за исключением дублирования парсера SQL Server.

1 голос
/ 09 ноября 2010

Я думаю, вы можете придумать регулярное выражение, но вполне вероятно, что оно не будет на 100% безопасным.

Лучший способ сделать это:
1. Либо напишите хранимые процедуры и представления, и ограничьте права пользователя на использование только их. (и операторы SELECT для определенных таблиц)
2. Создайте слой абстракции данных. Вы строите запросы, а не кто-то еще. Позвольте другим получить доступ только к некоторым из ваших методов, которые вы раскрываете.
3. Используйте LINQ to SQL, но скрывайте объект DataContext, чтобы изменения в базе данных не могли быть сделаны.

0 голосов
/ 09 ноября 2010

Я думаю, что разбор SQL будет решением: из другого вопроса

0 голосов
/ 09 ноября 2010

Убедитесь, что оператор начинается с ключевого слова SELECT, а затем убедитесь, что оператор не содержит точек с запятой (которые могли бы начать другой оператор SQL), которые не являются частями литеральных строк.

0 голосов
/ 09 ноября 2010

Поскольку оператор SELECT должен находиться в самом начале оператора, вы можете просто проверить строку, чтобы увидеть, являются ли первые 6 символов SELECT:

if (stringSql.Substring(0, 6).ToUpper() == "SELECT")
{
    //execute statement
}
...