2011-03-01 2 views
2

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

Я считаю, что переменные переменные еще хуже ... –

+4

время бросить свою текущую работу;) Это одна строка кода все говорит о вашей компании. – NikiC

+0

Поворот волшебных цитат; то вам больше не нужно будет снимать все теги. –

ответ

2

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

<input type="checkbox" name="valid_recipient[]" value="1" /> [email protected] 
<input type="checkbox" name="valid_recipient[]" value="x" /> [email protected] 

и

<input type="checkbox" name="valid_recipient1" value="1" /> [email protected] 
<input type="checkbox" name="valid_recipient2" value="x" /> [email protected] 

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

Кроме того, что злоумышленник от установки

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

в форму. удобно денди Ваш ПГБ в «делает нас полностью безопасным» процессор только счастливо сбросили атомную бомбу массив $ _POST, все в то же время «полностью безопасным»

+1

+1 для последней части;) – NikiC

0

Передача флажков как массив является Куш:

<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" /> 

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

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

<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> 
Смежные вопросы