2009-04-27 3 views
4

Например, я часто хотел искать StackOverflow с«Безопасное» позволяет пользователям осуществлять поиск с SQL

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

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

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

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

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

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

+0

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

+0

Я знаю, что вы давно это задали, в вашем примере - вы видели http://data.stackexchange.com/? Вы можете использовать SQL для запроса всего! Теперь я просматриваю их исходный код, чтобы узнать, сделали ли они что-нибудь особенное. – MikeMurko

+0

@MikeMurko: я не специально ищу решение ES/SO, а скорее общий способ принимать (частичные?) SQL-запросы от недоверенных конечных пользователей. – BCS

ответ

5

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

инъекции SQL
Просто санировать запрос

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

+1

'SELECT * FROM вопросы, вопросы, вопросы, вопросы, вопросы, вопросы ORDER BY RAND()' - я просто разбил ваш сервер, , –

+1

Нет, если вход правильно обработан. – Bratch

+0

@Bill Karwin: CPU/RAM/временные ограничения могут помешать этому запросу сбой. – BCS

2

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

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

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

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

+0

+1 Я полностью согласен. Пользователи должны вводить значения данных и, возможно, выбирать логику (например, ВСЕ ключевые слова против ЛЮБЫХ ключевых слов), но пользователи не должны иметь возможность вводить код, который выполняется дословно. –

+0

Проблема заключается в том, что к тому времени, когда я создам систему, которая бы не требовала от пользователя запроса, как я бы хотел, чтобы я мог это сделать, я бы пересмотрел многое/большинство частей только для чтения SQL. – BCS

+0

Я вам не верю. Ни одно приложение не нуждается в такой гибкости. –

1

Facebook делает это с FQL. См. blog post или presentation.

+0

Язык запросов API Yahoo аналогичен, но ссылки не помогают с частью реализации, а просто используют. – Trey

0

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

  • Использование MySQL и захватить это закон/файлы Yacc
  • использовать ЛЕКС файл как
  • кишка файл Yacc только вещи, которые вы хотите, чтобы правила
  • использование действий, которые выплевывают вход на успех.
+0

чтение ссылок Дэвида похоже, что это может быть именно то, что FQL (или, может быть, сделано непосредственно в взломанном MySQL, чтобы избежать возврата к тексту) – BCS

Смежные вопросы