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


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

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

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

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

Author: Cœur, 2010-06-07

5 answers

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

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

 6
Author: Emil Vikström, 2010-06-07 19:59:06

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

 8
Author: MANCHUCK, 2010-06-07 20:00:28

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

 2
Author: Raven Dreamer, 2010-06-07 19:52:36

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

 2
Author: Babiker, 2010-06-07 20:03:50

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

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

$данные = $валидатор->Дезинфицирует что-то ($данные); $объект->Что-то полезное ($данные);

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

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

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
Author: Dan Heberden, 2010-06-07 20:11:24