2012-04-10 2 views
2

Я этот код, который sanitises пользовательский ввод на переменной называется «имя пользователя»:санитарной обработки пользовательского ввода с помощью белого списка

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

if (!strlen($username_clean)){ 

die("username is blank!"); 

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

ответ

5

Если вы хотите, чтобы дезинфицировать все элементы в $_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), которые вы хотите дезинфицировать.

+0

Спасибо, так значит, мне все равно нужно применять инструкцию if к каждому входу? – user1278496

+0

@user: Да, вы бы это сделали. Вы хотите, чтобы сценарий «die()», если какой-либо из элементов пуст? – jedwards

+0

yes mate i would – user1278496

1

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

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"); 
+0

Спасибо, но как это применяется к каждому входу? например $ password $ first_name и т. д. – user1278496

+0

Вы должны проверить каждый из этих входов. Таким образом, это будет призыв к подтверждению ($ password, «Password»); для пароля и т. д. Или вы можете использовать array_map, чтобы применить его к каждой вещи в вашем массиве POST, как указано в другом ответе. –