Обработка флажков с помощью 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>