«Безопасно» позволяет пользователям выполнять поиск с помощью SQL - PullRequest
4 голосов
/ 28 апреля 2009

Например, я часто хотел искать переполнение стека с помощью

SELECT whatever FROM questions WHERE
   views * N + votes * M > answers AND NOT(answered) ORDER BY views;

или что-то в этом роде.

Есть ли какой-нибудь разумный способ разрешить пользователям использовать SQL в качестве языка поиска / фильтрации?

Я вижу несколько проблем с этим:

  • Доступ / изменение материала (тщательно настроенная учетная запись пользователя должна это исправить)
  • SQL-инъекция (учитывая предыдущее худшее, что они могут сделать, это вернуть обратно мусор и завершить сессию там).
  • DOS-атаки с патологическими запросами
  • Какие индексы вы им даете?

Редактировать: Я хотел бы разрешить объединения, а что нет.

Ответы [ 4 ]

5 голосов
/ 28 апреля 2009

Доступ / изменение вещи
Нет проблем, просто запустите запрос с искалеченным пользователем, с разрешениями только для выбора

SQL-инъекция
Просто санируйте запрос

DOS-атаки
Тайм-аут запроса и ограничить доступ по IP. Я думаю, вы также можете регулировать загрузку процессора на некоторых серверах

2 голосов
/ 28 апреля 2009

Если вы сделаете SQLEncode ввод ваших пользователей (и обязательно удалите также все ;!), Я не вижу никаких серьезных недостатков в безопасности (кроме того, что мы все еще раздаем ядерное оружие психам ... ) три поля ввода - одно для таблицы, одно для столбцов и одно для условий. Они не смогут иметь строки в своих условиях, но запросы, подобные вашему примеру, должны работать. Вы будете фактически вставлять вместе оператор SQL, так что вы будете контролировать то, что фактически выполняется. Если ваши настройки достаточно хороши, вы будете в безопасности.

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

Другой вариант - изобрести некоторый «язык разметки», вроде Markdown (платформа, которую SO использует для форматирования всех этих вопросов и ответов ...), который вы можете перевести на SQL. Затем вы можете убедиться, что выполняются только «безвредные» операции выбора, а также защитить пользовательские данные и т. Д.

На самом деле, если вы когда-нибудь это реализуете, вы должны увидеть, можете ли вы запускать команды из отдельной учетной записи на сервере SQL, который имеет доступ только к самым основным потребностям и, очевидно, только доступ для чтения.

1 голос
/ 28 апреля 2009

Facebook делает это с FQL . См. сообщение в блоге или презентацию .

0 голосов
/ 28 апреля 2009

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

  • Используйте MySQL и получите файлы lex / yacc
  • использовать файл lex как есть
  • удалить файл yacc только с теми вещами, которые вы хотите разрешить
  • использовать правила действий, которые выплевывают ввод при успехе.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...