2015-01-24 3 views
0

Я установил плагин на моем браузере firefox, который называется «SQL Inject Me», а затем я попробовал его на своем веб-сайте CakePHP. Я вижу, что он смог ввести несколько пустых учетных записей (некоторые с паролем), а некоторые - без пароля. База данных не допускается принимать значения, равные нулю для имени пользователя, электронной почты и т. Д. Также я не уверен, как он может обойти проверку кэша.проверка подлинности cakephp не выполняется при sql-инъекции

моего CakePHP проверка на поле имени пользователя

 'username' => array(
      'username must not be empty' => array(
       'rule' => 'notEmpty', 
       'message' => 'username field cannot be empty' 
      ), 


      'username must be unique' => array(
       'rule' => 'isUnique', 
       'message' => 'username is already taken' 

      ) 
      'username must not contain special character' => array(
       'rule' => 'usernameValidation', 
       'message' => 'username can only contain numbers, characters, underscores, dashes and Periods. Underscore, dash and Period are only allowed in the middle.' 
      ) 
     ) 
+0

Итак, в чем вопрос? – ndm

+0

Я бы не назвал это неудачным, так как это ожидаемое поведение, когда вы не требуете наличия полей при массовом ассимиляции/сохранении. Так что белее их, и этого не произойдет. См. [Здесь] (http://www.dereuromark.de/2010/09/21/saving-model-data-and-security/). – mark

+0

@ndm, вопрос в том, как я его предотвращаю. очевидно, что я не хочу, чтобы люди вводили пустые учетные записи в мою базу данных. – user3741033

ответ

0

Валидации были неудачными, поскольку если вы удаляете поля из формы с помощью инструментов разработчика, таких как firebug, то проверки для cakephp не будут работать для этих удаленных полей.

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

  if(!(isset($this->request->data['User']['email']))){ 
       $this->request->data['User']['email']=''; 
      } 
      if(!(isset($this->request->data['User']['username']))){ 
       $this->request->data['User']['username']=''; 
      } 
      if(!(isset($this->request->data['User']['password']))){ 
       $this->request->data['User']['password']=''; 
      } 
      if(!(isset($this->request->data['User']['confirm_password']))){ 
       $this->request->data['User']['confirm_password']=''; 
      }  

Если отсутствует поле, то этот код добавит это поле и присвоит ему пустую строку. Тогда эти поля будут иметь право на валидацию и, в конечном итоге, не подтвердят достоверность.

+0

У вас есть хорошие инстинкты, чтобы возиться с вашими формами с помощью различных инструментов! Рассмотрите возможность включения компонента безопасности: http://book.cakephp.org/2.0/ru/core-libraries/components/security-component.html. Также рассмотрите настройку поля в базе данных на «не null» без значения по умолчанию. –

0

Я думаю, что ваша валидация имеет неправильные ключи. Это должно быть так.

var $validate = array(
    'username' => array(
     'notEmpty' => array(
      'rule' => 'notEmpty', 
      'message' => 'username field cannot be empty' 
     ), 


     'isUnique' => array(
      'rule' => 'isUnique', 
      'message' => 'username is already taken' 

     ) 
     'usernameValidation' => array(
      'rule' => 'usernameValidation', 
      'message' => 'username can only contain numbers, characters, underscores, dashes and Periods. Underscore, dash and Period are only allowed in the middle.' 
     ) 
    ) 
) 

и, сохраняя их, вам просто нужно вызвать функцию проверки, чтобы пройти через правила проверки. Ссылка ниже может помочь вам проверить правильность работы контроллера при сохранении данных.

http://book.cakephp.org/2.0/en/models/data-validation/validating-data-from-the-controller.html

спасибо ..!

0

Добавить ключи 'required' => true, 'allowEmpty' => false в свои массивы валидации.

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