Санитарная обработка пользовательского ввода с использованием белого списка

У меня есть этот код, который дезинфицирует пользовательский ввод в переменной с именем «имя пользователя»:

$username_clean = preg_replace( "/[^a-zA-Z0-9_]/", "", $_POST['username'] );

if (!strlen($username_clean)){

die("username is blank!");

Я хочу выполнить один и тот же процесс для каждого входа на этой странице, но у меня есть около 12 разных входов, так как это форма регистрации. Есть ли более простой способ очистить и проверить каждый ввод вместо применения preg_replace() и оператора if для каждого?


person user1278496    schedule 10.04.2012    source источник


Ответы (2)


Если вы хотите очистить все элементы в $_POST, вы можете просто создать функцию очистки и применить ее ко всем элементам с помощью array_map:

$post_clean = array_map("sanitization_function", $_POST);

Тогда вы получите доступ к своим переменным через $post_clean вместо $_POST.

Это будет выглядеть примерно так:

function sanitize($dirty){ 
    return preg_replace( "/[^a-zA-Z0-9_]/", "", $dirty ); 
}

$cPOST = array_map("sanitize", $_POST);

if (!strlen($cPOST['username'])){ 
    die("username is blank!"); 
}

Если вы хотите очистить подмножество элементов $_POST, вы можете сделать что-то вроде:

$cPOST = array();
$sanitize_keys = array('username','someotherkeytosanitize');
foreach($_POST as $k=>$v)
{
    if(in_array($k, $sanitize_keys))
    {
        $cPOST[$k] = preg_replace( "/[^a-zA-Z0-9_]/", "", $v);
    }
    else
    {
        $cPOST[$k] = $v;
    }
}

Попробуй это:

$cPOST = array();
$sanitize_keys = array('username','someotherkeytosanitize');
for($_POST as $k=>$v)
{
    if(in_array($k, $sanitize_keys))
    {
        $cPOST[$k] = preg_replace( "/[^a-zA-Z0-9_]/", "", $v);
        if(strlen($cPOST[$k]) == 0){ 
            die("%s is blank", $k);
        }
    }
    else
    {
        $cPOST[$k] = $v;
    }
}
# At this point, the variables in $cPOST are the same as $_POST, unless you 
# specified they be sanitized (by including them in the $sanitize_keys array.
# Also, if you get here, you know that the entries $cPOST that correspond
# to the keys in $sanitize_keys were not blank after sanitization.

Просто не забудьте изменить $sanitize_keys на массив любых переменных (или ключей $_POST), которые вы хотите очистить.

person jedwards    schedule 10.04.2012
comment
Спасибо, значит ли это, что мне все еще нужно применять оператор if к каждому входу? - person user1278496; 10.04.2012
comment
@user: Да, вы бы. Вы хотите, чтобы скрипт умирал(), если какой-либо из элементов пуст? - person jedwards; 10.04.2012
comment
Спасибо братан попробую - person user1278496; 10.04.2012
comment
Расширяя первую часть этого ответа, вы можете запустить переменную $cPOST через функцию array_filter($input, $callback), где ваш обратный вызов возвращает true для пустого элемента массива. Затем вы можете проверить count() возвращаемого массива и array_keys(), чтобы отобразить имя полей с ошибкой. - person Salman A; 10.04.2012
comment
@jedwards: я получаю эту ошибку, используя вашу кодировку: Ошибка синтаксического анализа: синтаксическая ошибка, неожиданный T_AS, ожидание ';' в - person user1278496; 10.04.2012
comment
изменить на foreach -- извините за это - person jedwards; 11.04.2012

Если регулярное выражение и тест на отказ совпадают, вы можете написать функцию:

function validate($input, $input_name) {
  $clean_input = preg_replace( "/[^a-zA-Z0-9_]/", "", $input );
  if (!strlen($username_clean)){
    die("$input_name is blank!");
  }
  return $clean_input;
}
validate($_POST['username'], "Username");
person Nathaniel Ford    schedule 10.04.2012
comment
Спасибо, но как это применяется к каждому входу? например, $password $first_name и т. д. - person user1278496; 10.04.2012
comment
Вы должны проверить каждый из этих входов. Таким образом, это будет вызов validate($password, Password); для пароля и т. д. Или вы можете использовать array_map, чтобы применить его к каждой вещи в вашем массиве POST, как указано в другом ответе. - person Nathaniel Ford; 10.04.2012