Где проверить переменные (чтобы сделать это хорошо разработанным шаблоном)?

Допустим, у меня есть index.php файл и некоторые $_GET переменные. После нескольких сотен строк кода я вызываю метод с переменными в качестве параметров.

Должен ли я проверять переменные поверх всего, или я должен проверять их внутри класса / метода, который я вызываю?

2 вещи в виду:

  1. Избегать проверки переменных несколько раз, везде..

  2. Наличие нескольких источников, не только $_GETи несколько обращений к такому методу из разных файлов.

Некоторый код:

<?php
function do_something($string) {
    // Validate $string here?
}

// ...or here, before using it?
$result = do_something($_GET['some_string']);

4 ответа

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

<?
require_once "validator.php";

$validator = new Validator();
$validated = $validator->validateGet($_GET);

// all the remaining site's php code goes here

?>

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

Другим препятствием для межсайтового скриптинга и / или внедрения SQL должны быть подготовленные операторы: http://php.net/manual/de/pdo.prepared-statements.php Все ваши запросы SQL также должны содержаться во внешнем классе утилит под названием ProductDataAccessObject. (ProductDAO) или ProductQuerier и т. Д., Что также по структурным / техническим причинам. Но нет правила, которое гласит: "Вы должны проверять свои переменные в самом начале или во время использования".

Вы можете проверить в верхней части страницы каждую переменную одной строкой

$_GET = array_map("mysqli_real_escape_string",$_GET);

Array_map применяет одну функцию к каждому значению массива, который в нашем случае применяет mysqli_real_escape_string к массиву $_GET

ВАЖНЫЙ:

Пожалуйста, обратите внимание, что это только для санации, а не проверки

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

Обратитесь к этому вопросу для получения дополнительной информации: Санитарная обработка и проверка

Подтвердите в самом первом пункте, когда вы получаете $_GET на начальном уровне, так что вы уверены в приведенном ниже коде на более позднем этапе, а также

// Validate $_GET['some_string'] HERE
$result = do_something($_GET['some_string']);

Если вы подтвердите здесь -

function do_something($string) {
    // Validate $string here?
}

тогда есть вероятность, что вы пропустите проверку, и это откроет дыру в коде, поскольку проверка доступна только для метода на этот раз.

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

Я пока не удовлетворен вашими ответами, я не спрашивал, КАК проверять, я спрашивал, ГДЕ это сделать.

Вот мое собственное предложение:

Поскольку я думаю, что время процедурного кодирования в PHP, наконец, закончилось (!!), у меня нет никакой логики внутри моего index.php, вся логика переходит в классы контроллера.

Итак, у вас есть данные Senderи данные Reciever,

Как Reciever (не только в PHP, это также очень часто встречается в Realife), я должен проверить информацию, отправленную Sender, Reciever никому не доверяет (это важно, например, в API). Поэтому проверка должна быть внутри методов, которые вы создаете, а не на вершине index.php файлы или вне класса. Представьте, что кто-то другой использует ваш метод, он собирается проверить аргументы или это была ВАША задача? Я думаю, что это зависит от вас, поэтому вы (Reciever!) могу бросить Exceptions, Я также хотел бы сохранить свои данные ($_GET, $_POST,...) как можно более сырой вне контроллера. Представьте, что у вас есть метод, который нуждается в проверенных данных в строке 100и метод в строке 200 который нуждается в необработанных данных. Теперь на лжи 5 Вы превратили сырье в сани. => Вы должны сохранить две переменные, $data а также $data_raw, что является ненужным накладным расходом.

Думаю об этом

Другие вопросы по тегам