Проверьте операторы SQL в PHP на наличие плохих слов, таких как DROP или DELETE. - PullRequest
0 голосов
/ 26 января 2010

Я хотел бы разрешить некоторым администраторам вручную вводить операторы SQL в текстовое поле (для получения статистических данных и т. Д.). На уровне базы данных я защитил данные, создав пользователя, который может только выбирать, но не обновлять / удалять и т. Д.

Я хотел бы добавить вторую защиту, проверив вставленный SQL на наличие плохих слов, таких как DROP, DELETE или UPDATE. Я понял, как это сделать с помощью preg_match, но мне бы хотелось иметь умный скрипт, который может различать DROP и что-то вроде WHERE name = 'DROP 1'

РЕДАКТИРОВАТЬ: Я хотел бы войти, если администратор пытается использовать такие заявления. Вот почему мне нужна эта проверка безопасности второго уровня. Это для пояснения.

Кто-нибудь знает код, который подходит для этого примера?

Спасибо !!

Ответы [ 4 ]

10 голосов
/ 26 января 2010

Новый ответ

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

Зафиксируйте эту ошибку с помощью mysql_error(), а номер ошибки - с помощью mysql_errno(). Если в сообщении об ошибке указано "Команда DROP отклонена ..." или номер ошибки - 1142 , значит, вы знаете, что они пытались пошалить Искать термины в этой ошибке лучше, чем искать термины в их запросе, так как вы правильно указали, что в их запросе могут на законных основаниях использоваться плохие слова.

Оригинальный ответ

Если ваш пользователь может только SELECT, то он не может DROP или DELETE. Поиск этих слов не повышает безопасность, поскольку база данных будет отклонять любые запросы, которые явно не разрешены для данного пользователя.

3 голосов
/ 26 января 2010

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

Я бы начал с рассмотрения того, какие парсеры SQL доступны для PHP, а затем использовал один из них для анализа и анализа используемых операторов SQL.

Попробуйте один из них:

http://pear.php.net/package/SQL_Parser

http://sourceforge.net/projects/osqlp/

1 голос
/ 26 января 2010

Это определенно неподходящее место для установки этого уровня безопасности. Пока вы настроили базу данных, так что только у нее есть привилегии SELECT, они никак не могут изменить данные. Однако, если вы предоставите им какие-либо привилегии, которые могут изменять данные, то никакая семантическая проверка операторов SQL не обеспечит вам безопасность.

0 голосов
/ 26 января 2010

Почему бы вам просто не создать команды для данных статистики и позволить администраторам вызывать эти команды? Разве это не проще?

Не говорю, что админы намеренно причинят вред, но это может случиться!

...