Должна ли функция или вызывающий объект отвечать за проверку ввода?
Я провожу аудит безопасности довольно большого php-приложения и задавался вопросом, куда мне следует включить проверку ввода данных пользователем.
Должен ли я проверять данные, а затем отправлять чистые данные во внутренние функции или я должен полагаться на каждую функцию, чтобы выполнить ее собственную проверку? Или даже и то, и другое?
Существует ли какой-либо стандарт или наилучшая практика для такого рода вещей?
В настоящее время приложение делает и то, и другое непоследовательно, и я хотел бы сделать вещи более последовательными.
5 answers
Вам определенно следует проверить данные извне как можно скорее. В зависимости от архитектуры проверка серверной части внутри ответственных функций может быть вторым шагом, но не зависит от проверки серверной части, а проверяет данные, когда они поступают в ваше приложение.
Плюсы с проверкой внутри функций в дополнение к предыдущей проверке заключаются в том, что проще (и безопаснее) поддерживать систему, потому что (более неаккуратные) разработчики после того, как вы не можете сломать приложение. Если у вас есть приложение с поддержкой плагинов, например, для сторонних плагинов, также необходимы безопасные функции.
И то, и другое - лучший ответ. Проверка данных должна выполняться в каждой функции, которая будет обрабатывать данные, чтобы избежать проблемы разработки, основанной на надежде (Жесткий диск)
Я думаю, что если вы можете сделать и то, и другое, и время/ресурсы не являются проблемой, почему бы и нет?
Проверка в бэкэнде похожа на проверку пассажиров после того, как они сели в самолет. Весь смысл проверки заключается в том, чтобы предотвратить внедрение элементов, которые могут заглушить ваше приложение. Поэтому вы должны пройти проверку, прежде чем войти в ворота:)
Это зависит от области применения/определения приложения. Но традиционно ваши функции используются в местах, где $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;
}
}