Как создать динамические и безопасные запросы

Вы не можете помешать владельцу стола сбросить триггер на нем, если вы не хотите писать для этого триггер события.

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

6
задан Emrah Diril 10 November 2008 в 17:56
поделиться

4 ответа

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

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

Я работал над названным классом PHP Zend_Db_Select это обеспечивает API для помощи с этим. Если Вам нравится PHP, Вы могли бы посмотреть на тот код для идей. Это не обрабатывает вообразимого запроса, но это делает много.

Некоторые другие платформы базы данных PHP имеют аналогичные решения.

2
ответ дан 17 December 2019 в 18:20
поделиться

Хорошо опции должны отобразиться на что-то.

Строка SQL-запроса CONCAT не проблема, если Вы все еще используете параметры для опций.

0
ответ дан 17 December 2019 в 18:20
поделиться

Хотя не общее решение, вот некоторые шаги, которые можно сделать для смягчения динамической все же безопасной проблемы запроса.

Критерии, в которых значение столбца принадлежит множества значений, кардинальность которого произвольна, не должны быть динамичными. Рассмотрите использование или функции instr или использования специальной таблицы фильтрации, в которой Вы присоединяетесь против. Этот подход может быть легко расширен на несколько столбцов, пока число столбцов известно. Фильтрация на пользователях и тегах могла легко быть обработана с этим подходом.

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

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

Чтобы быть безопасной от Внедрения SQL, или создать или получить библиотеку, которая защищает от того нападения. Хотя более трудный, это не невозможная задача. Это главным образом о выходе из строковых разделителей SQL в значениях для фильтрации для.

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

1
ответ дан 17 December 2019 в 18:20
поделиться

Если бы Вы использовали Python для доступа к базе данных, то я предложил бы, чтобы Вы использовали систему модели Django. Существуют многие подобная пчела и для Python и для других языков (особенно в рубине на направляющих). Я экономлю так много времени путем предотвращения потребности говорить непосредственно с базой данных с SQL.

Из ссылки в качестве примера:

#Model definition
class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def __unicode__(self):
        return self.name

Образцовое использование (это - эффективно оператор вставки),

from mysite.blog.models import Blog
b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
b.save()

Запросы становятся намного более сложными - Вы раздаете объект запроса, и можно добавить фильтры / элементы вида к нему. Когда Вы наконец готовы использовать запрос, Django создает SQL statment, который отражает все способы, которыми Вы скорректировали объект запроса. Я думаю, что это является очень милым.

Другие преимущества этой абстракции

  • Ваши модели могут быть созданы как таблицы базы данных с внешними ключами и ограничениями Django
  • Много баз данных поддерживаются (Postgresql, Mysql, sql облегченный, и т.д.)
  • DJango анализирует Ваши шаблоны и создает автоматический администраторский сайт из них.
0
ответ дан 17 December 2019 в 18:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: