Очистка переменных $_POST

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

//clean the user 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

То, что вы делаете, недостаточно. См. здесь.

Ответ 2

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

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

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

В w3schools имеется множество различных параметров фильтра ссылка на фильтр

Ответ 3

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

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

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

Ответ 4

Флажки

unchecked не отправляются на сервер.

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

Ответ 5

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

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

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