Выполнить запрос, только если это оператор выбора. Как? - PullRequest
2 голосов
/ 04 марта 2011
string sqlQuery = "unknown";

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

Интересно, есть ли способ добиться этого без разбора содержимого параметра sqlQuery. Я хотел бы сделать это, используя диез для запросов оракула.

Любые советы. Спасибо.

Обновление:

  1. Это должно работать для всех типов пользователей со всеми привилегиями.

Ответы [ 8 ]

6 голосов
/ 04 марта 2011

Запустите запрос в контексте пользователя, который имеет только права выбора.Любой другой тип запроса приведет к ошибке.

2 голосов
/ 04 марта 2011

SET TRANSACTION READ ONLY, затем выполните строку.Если он попытается изменить данные, он выдаст ошибку ORA-01456.Вы можете поймать это в ловушку и вернуть все, что хотите.

1 голос
/ 04 марта 2011

Помните, что столбец SELECT FROM таблицы FOR UPDATE по-прежнему будет монопольно блокировать каждую строку в этой таблице. И для этого нужны только привилегии SELECT (не требуется ни INSERT, UPDATE, ни DELETE).

1 голос
/ 04 марта 2011

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

Основы таковы:

  • дает только минимальные необходимые привилегии, например, только дает пользователю«выберите», как описано в предыдущем ответе.И то только по минимально необходимому набору таблиц.Представления действительно полезны здесь для ограничения доступа.
  • Используйте переменные связывания, где это возможно.
  • Если вы не можете использовать переменные связывания, проверьте чистоту вашего оператора с помощью DBMS_ASSERT
1 голос
/ 04 марта 2011

Я бы не позволил клиенту указать строку выбора SQL.Слишком много возможных векторов атаки.

Рассматривали ли вы использование Linq?Вызывающий может передать Func<T, bool>, который может быть передан в предложение Where.Поскольку Linq сгенерирует оператор select для вас, не будет возможности произойти без выбора.

1 голос
/ 04 марта 2011

Вероятно, вы можете искать в строке ключевые слова, такие как «обновление», «удаление», «усечение» и все другие способы, которыми вы можете использовать ddl или dml в таблице, но это очень подвержено ошибкам. Вы должны исключить строки в запросе, которые могут иметь эти ключевые слова, и есть много ключевых слов, которые вы должны принять во внимание.

Если ваше требование состоит в том, чтобы возвратить ноль, почему бы не дать только привилегию выбора для необходимых объектов и вернуть ноль, если вы столкнулись с ошибкой Недостаточные привилегии?

http://download.oracle.com/docs/cd/E11882_01/server.112/e17069/strms_trapply.htm#STRMS1065

0 голосов
/ 05 марта 2011
string sqlQuery = "("+evil_sql+")";

Только подзапрос может начинаться с круглых скобок.Это остановит DML, DDL и проблему FOR UPDATE, о которой упоминал Гэри.Вы все еще должны выполнить все, просто поймать все ошибки.Я сделал это на общедоступном веб-сайте без каких-либо проблем.

Даже если вашему пользователю ничего не предоставлено напрямую, вам нужно будет проверить наличие ненужных грантов PUBLIC.И конечно держите вашу систему исправленной.В функциях, которые можно вызывать в SELECT, были эксплойты.

0 голосов
/ 04 марта 2011

Вы можете использовать ADO.NET SqlCommand http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx. У него есть методы ExecuteReader для запроса выбора типа и ExecuteNonQuery для другого выражения SQL, вы просто устанавливаете строковый атрибут CommandText. Если я прав, он выдает исключение, если запрос не является выбором в ExecuteReader, но вы должны проверить его.

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