Что значит разрешить только ожидаемый ввод в php?

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

Вот код, который они показывают:

<?php
$expected = array( 'carModel', 'year', 'bodyStyle' );
foreach( $expected AS $key ) {
if ( !empty( $_POST[ $key ] ) ) {
${$key} = $_POST[ $key ];
}
else {
${$key} = NULL;
}
}
?>

Я немного запутался, есть небольшой абзац, который объясняет, что делает код. Для того, что я получаю, он присваивает значение из массива в качестве ключа для $_POST. Это также говорит о том, что массив должен быть программно скопирован из массива GPC.

Что я не понимаю, так это в каких случаях я должен использовать это? А что такое массив GPC?

3 ответа

Решение

Код создает переменные из данных в $_POST массив. Имена переменных взяты из ключей $_POST массив. PHP называет это (то есть, называет переменные динамически) переменными переменными.

Обычно это плохая идея, потому что вы не контролируете, какие ключи присутствуют в $_POST массив, и, следовательно, какие переменные создаются. Пользователь вашего сайта контролирует это. Злонамеренный пользователь может именовать переменные POST таким образом, что они перезаписывают переменные, которые вы предназначали для различных целей.

Книга предлагает разрешить ключи в $_POST массив для перезаписи переменных контролируемым образом. Это то что $expected = array('carModel', 'year', 'bodyStyle') для. Этот и следующий код только создает переменные $carModel, $year а также $bodyStyle, Если, например, пользователь постит current_user_has_admin_rights=1 вам приложение, переменная $current_user_has_admin_rights со значением 1 не будет создано.

Мое предложение состоит в том, чтобы полностью избежать переменных переменных и вместо этого получить доступ к значениям POST через $_POST только массив Это проясняет, откуда берется значение, и, таким образом, легче определить, обрабатывается ли такое значение небезопасным образом.

GPC = Получить Post Cookie, он ссылается на переменные, поступающие от пользователя / браузера. Таким образом, вместо использования $_GET, $_POST, $_COOKIE вы должны очищать и проверять эти данные в переменной (переменных), которым вы можете доверять и которые, как вы знаете, являются чистыми.

Что касается предложения, то, что они делают, ограничивает доступ к вашему коду. В приведенном выше примере кода у вас, вероятно, будет форма на странице с элементами с именами carMOdel, year и bodyStyle. Код здесь ограничивает ваш код ТОЛЬКО взаимодействием с этими тремя элементами.

Это препятствует тому, чтобы кто-то передавал дополнительные параметры на вашу страницу в попытке внедрить код или какую-либо атаку SQL-инъекции или любое другое количество вещей. В таком простом примере это может не иметь смысла. Но бывают случаи, когда люди принимают запросы form/api и запускают циклы над всем в одном из массивов GPC и делают что-то там. Я бы предложил не делать этого для начала.

Это всего лишь одна из многих вещей для защиты вашего сервера / базы данных. При разработке веб-приложений вы должны занять позицию доверия НИЧЕГО со стороны пользователя.

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

Это также говорит о том, что массив должен быть программно скопирован из массива GPC.

Это может означать, что вам не обязательно писать:

$expected = array('carModel', 'year', 'bodyStyle');

Скорее напишите что-то вроде:

$expected = getExpectedInput('carForm');

Где функция getExpectInput будет запрашивать базу данных для ввода, который должен быть в форме 'carForm'. Или, возможно, это может быть в файле, и эта функция будет получать этот контент. По сути, они означают, что это не очень хорошая идея жестко кодировать переменные в форме. Скорее напишите их где-нибудь, чтобы их было легко изменить. Если вы когда-либо вносили изменения в форму и добавляли переменную или изменяли имя переменной, вам не нужно изменять этот конкретный код. Это означает, что эта функция может использоваться в разных формах. Идея состоит в том, чтобы написать функцию, которую можно использовать повторно. Не те, которые посвящены одной вещи. ООП.

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

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