Должен функция или вызывающая сторона быть ответственными за контроль ввода?

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

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

Есть ли какая-либо стандартная или лучшая практика для этого вида вещи?

В настоящее время приложение делает и несовместимо и мне понравится делать вещи более последовательными.

7
задан Cœur 19 August 2017 в 16:47
поделиться

5 ответов

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

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

6
ответ дан 6 December 2019 в 09:18
поделиться

Я думаю, если вы можете делать и то, и другое, и время / ресурсы не являются проблемой, почему бы и нет?

2
ответ дан 6 December 2019 в 09:18
поделиться

Это зависит от сферы применения/определения приложения. Но традиционно ваши функции используются во многих местах $object->doSomething() делает именно это. Полагаясь на валидацию там, вы предотвращаете возможность сделать DoSomething() по собственному желанию, понимаете?

Кроме того, если вы держите валидацию снаружи, вы можете легко управлять ею. Нет необходимости искать ее в этой конкретной внутренней функции. Сохраняйте ООП, но больше похоже на

$data = $validator->sanitizeSomething($data); $object->doSomething($data);

это позволяет разделить правила валидации и легко управлять ими, а также внутренними функциями.

Чтобы уточнить, скажем, у вас есть объект db, который добавляет массив в таблицу:

class db {
   function addRow($table, $associativeArray) {
      // primitive i know, just an example 
   }
}

хотите ли вы, чтобы ваша валидация была там?

function addRow($table, $associativeArray) {
    if( isset( $assiciativeArray['description'] ) {
       // validate
    }
}

было бы глупо - вы бы хотели, чтобы она была в объекте, в котором вы работаете

class product {
   function update() {
       if( $this->validate() ) {
          $this->db->addRow($this->toArray()); // or something, you get the idea, ya?
       }
   }
   function validate() {
      if( $this->description != "") {
         return true;
      }
      return false;
   }
}
2
ответ дан 6 December 2019 в 09:18
поделиться

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

8
ответ дан 6 December 2019 в 09:18
поделиться

Проверка на бэкэнде похожа на проверку пассажиров после того, как они сели в самолет. Весь смысл валидации заключается в том, чтобы предотвратить внедрение элементов, которые могут заблокировать работу вашего приложения. Так что вы должны подтвердить, прежде чем входить в ворота :)

2
ответ дан 6 December 2019 в 09:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: