Обработка флажков с помощью PHP - PullRequest
2 голосов
/ 01 марта 2011

Мой босс установил скрипт для обработки форм через 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 ]

2 голосов
/ 01 марта 2011

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

<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, при этом будучи «полностью безопасным»

0 голосов
/ 01 марта 2011

Передача флажков в виде массива - 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" />

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

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

<code><pre>
<?php 
session_start();
$_SESSION['logged_in_user'] = 'pygorex1';
print_r($_SESSION);
foreach ($_POST as $k => $v) {
    $$k = $v;
}
?>
иди иди гаджет
<?php 
print_r($_SESSION);
print_r($myarray);
session_write_close();

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

?>
...