Как ограничить sqlite только для выполнения операторов SELECT, а не INSERT, UPDATE - PullRequest
1 голос
/ 18 января 2011

У меня есть страница отчетов, где вы можете ввести запрос для отчета вручную. Как я могу заблокировать любые операторы INSERT, UPDATE или DELETE и запускать только SELECT?

using (var connection = new SQLiteConnection(connectionString))
            {
                var da = new SQLiteDataAdapter
                {
                    SelectCommand = new SQLiteCommand(query, connection)
                };
                try
                {
                    da.Fill(table);
                }

Я могу проверить, содержит ли строка запроса «INSERT», «UPDATE» или «DELETE», но я не думаю, что это хорошая практика.

Ответы [ 5 ]

1 голос
/ 18 января 2011

Вы можете использовать оператор <a href="http://www.sqlite.org/lang_explain.html" rel="nofollow">EXPLAIN</a>, чтобы разбить запрос на команды VM и изучить столбец opcode вывода.Если встречается значение "OpenWrite", запрос не доступен только для чтения.

1 голос
/ 18 января 2011

фактически вы проверяли, что происходит, когда вы пытаетесь заполнить таблицу с помощью адаптера данных, имеющего что-то кроме выбора в переменной запроса?Я сомневаюсь, что вы получите пустую таблицу или набор данных, я бы ожидал исключение, в этом случае вы могли бы откатить транзакцию.

В любом случае я бы попытался создать соединение только для чтения, как предложено выше Sorax, и я бы на самом деле проанализировалпеременная запроса.

1 голос
/ 18 января 2011

Проверка строки запроса не является хорошей практикой?По сравнению с чем?Разрешить пользователю вводить какие-либо операторы SQL на странице своего отчета?Я не могу думать о гораздо худшей практике, чем эта.Если вы собираетесь разрешить подобные вещи, вам абсолютно необходимо каким-то образом ограничить типы вводимых операторов и, возможно, потребовать предложение Where (чтобы избежать возврата миллионов строк) и т. Д.

0 голосов
/ 18 января 2011

A) Используйте соединение только для чтения - я думаю, что это было бы почти лучшим решением

B) Использовать более одного TextBox в качестве входных данных (но это стало бы больше решением, таким как проверка строки для вставкии т. д.)

Например

Выбрать | _ ___ |От | __ _ __ _ ___ |Где | __ _ __ _ _ |

Редактировать: чтобы ответить на ваш комментарий, просто посмотрите на http://www.sqlite.org/c3ref/open.html особенно тема "SQLITE_OPEN_READONLY" - я ничего не сделал с sqlite сейчас, но я думаю, что это должно сработать ...

0 голосов
/ 18 января 2011

Поскольку база данных SQlite - это всего лишь один файл, я предполагаю, что вы можете сделать базу данных доступной только для чтения через файловую систему. Это, конечно, не причудливое решение, но оно не требует никакого кода (конечно, за исключением случаев, когда вы генерируете исключения, когда запись невозможна).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...