Как избежать CakePHP $ this-> дыры в безопасности данных? - PullRequest
1 голос
/ 29 июля 2011

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

function edit() {
  if(!empty($this->data)) {
    if($this->User->save($this->data)) {
    }
  }
}

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

Это может пойти еще дальше, если кто-то использует saveAll (), который позволяет проверять и сохранять несколько моделей за один снимок,Если бы из полей формы можно было угадать, какие модели использовать, вы могли бы легко перейти к другим моделям и таблицам, а также изменить эту информацию.

Теперь, когда вы понимаете мои проблемы, мой вопрос заключается в том, что было бы лучше или как минимумпочти лучший метод, чтобы избежать этого?

Я знаю, что могу просто получить нужные данные из $ this-> data в другую переменную и затем передать их в save или saveAll, но поскольку существует много форм иajax-запросы, это было бы довольно много работы.Но это единственный путь или есть лучшие пути?

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

1 Ответ

2 голосов
/ 01 августа 2011

После нескольких дней исследований я обнаружил, что это на самом деле не «дыра в безопасности», а скорее ошибка новичка.

Существует два способа избежать подделки этого типа: Компонент безопасности (http://book.cakephp.org/view/1296/Security-Component), который автоматически получает CSRF и защищает от несанкционированного изменения формы путем создания одноразовых хэшей для полей формы.

Другой способ - дать третий параметр функции save ().Сохранение фактически получает 3 параметра: data, validate, fieldlist.Параметр fieldlist действует как белый список полей, которые разрешено сохранять.

Я впервые сообщил об этой проблеме как об ошибке в CakePHP, которой тогда не было, но этот парень из Euromark ответил мне, что он сделал хорошее документированиео реальной проблеме и о том, как сделать безопасное сохранение, и я действительно думаю, что это было довольно хорошее чтение.Так что, если у вас есть такие же проблемы, пожалуйста, смотрите эту страницу: http://www.dereuromark.de/2010/09/21/saving-model-data-and-security/

...