Использование Regex в предложениях MySQL WHERE при определенных условиях - PullRequest
2 голосов
/ 30 июля 2010

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

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

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

  • Существует одинаковое количество скобок вне кавычек

  • Нет висящих кавычек

  • Первая скобка не является закрывающей скобкой

  • Последняя скобка не является открывающейскобка

  • Комментариев нет

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

Ответы [ 2 ]

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

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

если вы беспокоитесь о том, что ввод не очищен, значит, вы не делаете его достаточно быстрым и простым для экранирования параметров.для преобразования любой php-переменной в безопасный литерал mysql требуется всего одна приличная функция.углубиться в тех авторов, что они должны использовать эту функцию для каждого параметра.например, метод класса db:

final function esc($val) {
    if ($val === null)
        return 'NULL';
    if (is_bool($val))
        return $val ? 'TRUE' : 'FALSE';
    if (is_int($val) || is_float($val) || (is_string($val) && $val === (string) (int) $val))
        return $val;
    if (is_object($val) || is_array($val))
        $val = serialize($val);
    else
        $val = (string) $val;
    if (strlen($val)) {
        if ($this->real_esc)
            $val = mysql_real_escape_string($val, $this->cnn);
        else
            $val = mysql_escape_string($val);
    }
    return "'$val'";
}

, где $this->real_esc = function_exists('mysql_real_escape_string'); уже выполнен для производительности.

0 голосов
/ 30 июля 2010

Я говорю, а почему бы и нет?Ремни и брекеты прочь!Я бы все же предпочел предоставить API, позволяющий им отправлять запросы частично или полностью.Это позволит вам использовать параметризованные запросы (подготовленные операторы).

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