Где проверить переменные (чтобы сделать это хорошо разработанным шаблоном)?
Допустим, у меня есть index.php
файл и некоторые $_GET
переменные. После нескольких сотен строк кода я вызываю метод с переменными в качестве параметров.
Должен ли я проверять переменные поверх всего, или я должен проверять их внутри класса / метода, который я вызываю?
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
, что является ненужным накладным расходом.
Думаю об этом