2009-10-22 2 views
11

Я пытаюсь найти способ эффективно легко очистить переменные POST и GET с помощью одной функции. Вот сама функция:

//clean the user's input 
function cleanInput($value, $link = '') 
{ 
    //if the variable is an array, recurse into it 
    if(is_array($value)) 
    { 
     //for each element in the array... 
     foreach($value as $key => $val) 
     { 
      //...clean the content of each variable in the array 
      $value[$key] = cleanInput($val); 
     } 

     //return clean array 
     return $value; 
    } 
    else 
    { 
     return mysql_real_escape_string(strip_tags(trim($value)), $link); 
    } 
} 

А вот код, который бы назвал это:

//This stops SQL Injection in POST vars 
foreach ($_POST as $key => $value) 
{ 
    $_POST[$key] = cleanInput($value, $link); 
} 

//This stops SQL Injection in GET vars 
foreach ($_GET as $key => $value) 
{ 
    $_GET[$key] = cleanInput($value, $link); 
} 

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

Я протестировал свой код без вышеуказанной функции, и он отлично работает, я просто хочу, чтобы в нем был добавлен бит безопасности.

Спасибо!

+1

Вам следует избегать попытки дезинформировать все для каждого контекста. Это только мешает вашему приложению и затрудняет защиту, когда вы хотите воссоздать утраченные функции. Это допустимая причина, по которой magic_quotes был отключен. http://php.net/manual/en/security.magicquotes.php То, что вы воссоздаете в некотором смысле здесь. Ввод должен быть дезинфицирован для приложения, к которому вы его отправляете. Если вы отправляете браузер через HTTP, дезинфицируйте его для HTTP и HTML. Если вы отправляете его в SQL DB, дезинфицируйте его для SQL. – bucabay

+0

извините, я имел в виду устаревшее: http://php.net/manual/en/security.magicquotes.php – bucabay

+0

Спасибо за помощь/совет! Похоже, мне нужно переосмыслить мой процесс. :-) – tscully

ответ

22

Используйте filter_input, если это возможно (php5 +). Он держит его намного чище и насколько я знаю, вы можете санировать и проверять все, что вам нужно, чтобы использовать его.

Вы можете использовать filter var array и, например FILTER_SANITIZE_STRING флага, чтобы фильтровать весь пост массива

filter_var_array($_POST, FILTER_SANITIZE_STRING) //just an example filter 

Есть множество различных вариантов фильтров, доступное на W3Schools filter reference

+0

О, это потрясающе!я никогда не видел этого раньше :) – Mickey

+1

это лучший способ, если у вас есть php5 – robjmills

1

непроверенных флажки не посылаемые на сервер ,

вы можете использовать array_walk_recursive делать то, что вы хотите

6

сделать рекурсию более изящным вы могли бы использовать что-то вроде array_map, например:

$_POST = array_map('mysql_real_escape_string',$_POST); 

Используйте фильтр вар, если вы можете, хотя, как такого рода подходов, как правило, плохо, просто пример, хотя;)

1

Это неправильный способ очистки ввода.

Применять защитную оболочку mysql на абсолютно все в $_POST и $_GET будет возвращаться и укусить вас, если вы все еще хотите использовать данные после того, как вы сделали запрос к базе данных, но вы не хотите, чтобы escape-символы в там.

Использовать параметризованные запросы с помощью mysqli или PDO, и вам никогда не понадобится использовать mysql_real_escape_string().

+0

Еще хуже, если у вас нет подключения к уже запущенной базе данных. – alex

+0

У меня есть соединение, установленное прямо над вызовом функции, но вам, ребята, не нужно видеть, что у меня там есть. ;-) – tscully

+0

см .: http://php.net/manual/en/security.magicquotes.php – bucabay

Смежные вопросы