Безопасно позволяйте пользователям динамически выбирать поля / условия базы данных для поиска - PullRequest
2 голосов
/ 01 ноября 2011

Я расширяю сайт cakePHP 1.3.13, и мой пользователь должен иметь возможность практически создавать свои собственные SELECT запросы для некоторых данных через веб-приложение.Раньше они буквально запрашивали базу данных MS Access, но теперь им придется использовать элементы управления формой для поиска по сайту, но они привыкли и требуют определенной гибкости.

Они ищут билеты, и есть пара SELECT полей, которые они не всегда должны видеть, и пара WHERE условий, по которым они не всегда должны фильтроваться, и яЯ пытаюсь выяснить, как разрешить функциональность без добавления целых систем безопасности динамического SQL.

Вот мой метод поиска:

$tickets = $this->Hauler->find('all', array(
        'conditions'=>array("ticketDate between'$startDate' and '$endDate'", "LocationID='$plant_id'", 'paid=0'),
        'fields'=>array('LocationID','OrderID','TicketDate','TicketNo','FreightPay','Qty','Total', 'Paid'),
        'order'=>array('TicketDate', 'LocationID','OrderID'),
        ));

Единственный способ, которым я могу подумать, включить динамические полябудет использовать операторы if для выбора одного из предопределенного набора всех возможных комбинаций полей (не масштабируемых, раздражающих) или для создания массива $fields для добавления к клавише [fields].

Условия имеют схожие проблемы, и мне уже неудобно, включая конкатенацию строк, например between '$startDate', но я не знаю лучшего способа там.CakePHP утверждает, что они дезинфицируют меня , если я использую метод find(), но я не уверен, насколько хорошо.

Существует ли какой-либо конкретный метод, разрешающий эти "динамические" поискибез рискованного на самом деле динамического SQL? Я хотел бы продолжать использовать метод find () в CakePHP, я знаю, что хранимые процедуры позволяют мне это делать, но это тот случай, когда я хочулогика в коде.Кроме того, я должен предпринять дополнительные шаги очистки вне того, что метод Cake find() делает в любом случае?

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

Обновление: я обновил свой код и решил проблему fields согласно предложению @Anh Pham, но я все еще продолжаюне могу получить опционально conditions работу еще.Вот мой новый код:

        $tickets = $this->Hauler->find('all', array(
        'conditions'=>array('Hauler.ticketDate BETWEEN ? AND ?' => array($startDate,$endDate), 'Hauler.LocationID'=>$plant_id, 'Hauler.paid'=>0),
        'order'=>array('TicketDate', 'LocationID','OrderID'),
        ));

Это генерирует запросы наподобие WHERE LocationID='', если LocationID не передается через форму, вместо проверки на пустую строку. Я бы хотел, чтобы мой запрос пропускал часть LocationID=WHERE, если LocationID не указан.

Ответы [ 2 ]

1 голос
/ 02 ноября 2011

Первый:

$tickets = $this->Hauler->find('all', array(
  'conditions'=>array('Hauler.ticketDate BETWEEN ? AND ?' => array($startDate,$endDate), 'Hauler.LocationID'=>$plant_id, 'Hauler.paid'=>0),
  'order'=>array('TicketDate', 'LocationID','OrderID'),
));

Пользователи могут видеть только те поля, которые вы выводите, а не все поля в результатах. create a $fields array to append to the [fields] key, which is obviously unsafe. Не понимаю, как это небезопасно.

Cake find () защищает вас от внедрения SQL. Поэтому я не вижу здесь проблемы безопасности.

0 голосов
/ 01 ноября 2011

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

...