Обработка флажков с помощью PHP

Мой босс установил скрипт для обработки форм через PHP и отправки результатов по электронной почте. Мы обязаны использовать этот процессор. Проблема с процессором заключается в следующей строке кода:

foreach ($_POST as $k => $v){$$k = strip_tags($v);}

Это было бы хорошо, если бы все отправленные значения были просто строками, но я пытаюсь обработать некоторые флажки, которые передаются как массивы. Из того, что я понимаю, функция strip_tags работает только со строками. Он обрабатывает все и отправляет результаты по электронной почте, как и должен, но выдает уведомление каждый раз, когда пытается обработать серию флажков. Обратите внимание: преобразование массива в строку... Процесс все еще работает, я просто получаю ужасные уведомления повсюду. Чтобы временно решить проблему, я удалил функцию strip_tags, в результате чего получилось следующее:

foreach ($_POST as $k => $v){$$k = $v;}

Теперь все работает правильно, и я не получаю предупреждений, ошибок или уведомлений. Однако, после указания на это моему боссу, он хочет, чтобы я вернулся к исходному коду, а затем присвоил каждому флажку свое уникальное имя, вместо того, чтобы присвоить им одно и то же имя с разными значениями. Я мог бы сделать это, но я знаю, что это неправильный способ обработать серию флажков. Плюс это создает все виды головных болей. Мой босс просто не понимает, как работать с массивами, поэтому каждый раз, когда он сталкивается с ним, он придумывает глупые обходные пути, подобные этому. Он также утверждает, что это своего рода защита от спама, которая не позволяет людям добавлять получателей в наши формы. Возможно, я не эксперт в PHP, но я уверен, что это утверждение неверно.

Итак, что я могу сделать, чтобы решить эту проблему? Я знаю, что мне следует сначала преобразовать массивы флажков в строки, а затем использовать функцию strip_tags в полученных строках, но я все еще довольно новичок в PHP и не совсем понимаю, с чего эта строка кода начинается. Кто-нибудь может помочь хотя бы указать мне правильное направление?

2 ответа

Укажите своему боссу, что:

<input type="checkbox" name="valid_recipient[]" value="1" /> fred@example.com
<input type="checkbox" name="valid_recipient[]" value="x" /> nasty@badperson.com

а также

<input type="checkbox" name="valid_recipient1" value="1" /> fred@example.com
<input type="checkbox" name="valid_recipient2" value="x" /> nasty@badperson.com

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

Кроме того, что злонамеренный пользователь от настройки

<input type="hidden" name="_POST" value="haha I wiped your post array!" />

в форму. Удобный денди вашего PHB "делает нас полностью защищенными", процессор просто удачно обстрелял массив $_POST, при этом будучи "полностью безопасным"

Передача флажков в виде массива - это kush:

<input type="checkbox" name="myarray[key1]" value="hello world" />
<input type="checkbox" name="myarray[key2]" value="well hello again" />

Будет создан результирующий $_POST как:

Array
(
    [myarray] => Array
        (
            [key1] => hello world
            [key2] => well hello again
        )

)

Хотя это здорово, это также означает, что ваш код боссов вдвойне небезопасен:

Во-первых, не имея strip_tags там делает вас уязвимыми для атак XSS.

Во-вторых, наивно доверяя $_POST Имена переменных и их экспорт в глобальное пространство имен - это путь к катастрофе. (Есть причина, почему register_globals ушла в прошлое).

Например, скажем, вы отслеживаете имя пользователя, который вошел в систему с помощью простого $_SESSION переменная. Что-то вроде этого:

if ($_SESSION['logged_in_user'] == 'admin') {
   // do administrator things
}

Ну, принимая и экспортируя $_POST Переменные и злоумышленник могут изменить элемент формы HTML следующим образом:

<input type="checkbox" name="myarray[key1]" value="hello world" />

И превратить это в нечто подобное (используя Firebug или Chrome):

<input type="checkbox" name="_SESSION[logged_in_user]" value="admin" />

Тад-ах! Любой анонимный пользователь может получить доступ администратора к веб-сайту.

Вот простой скрипт для вашего рассмотрения:

<pre>
<?php 
session_start();
$_SESSION['logged_in_user'] = 'pygorex1';
print_r($_SESSION);
foreach ($_POST as $k => $v) {
    $$k = $v;
}
?>
</pre>
<form method="post">
<input type="checkbox" name="myarray[key1]" value="hello world" />
<input type="checkbox" name="_SESSION[logged_in_user]" value="admin" />
<input type="submit" value="go go gadget" />
</form>
<pre>
<?php 
print_r($_SESSION);
print_r($myarray);
session_write_close();

if ($_SESSION['logged_in_user'] == 'admin') {
    echo("OWNED\n");
}

?>
</pre>
Другие вопросы по тегам