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

Я пытаюсь найти способ эффективно и легко очистить все переменные 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);
}

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

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

Спасибо!


person tscully    schedule 22.10.2009    source источник
comment
Вам следует избегать попыток дезинфицировать все для каждого контекста. Это только мешает вашему приложению и затрудняет защиту, когда вы хотите восстановить утраченную функциональность. Это веская причина, по которой magic_quotes был отключен. php.net/manual/en/security.magicquotes.php Что-то вы ' в каком-то смысле воссоздает здесь. Входные данные необходимо обработать для приложения, в которое вы их отправляете. Если вы отправляете в браузер через HTTP, очистите его для HTTP и HTML. Если вы отправляете его в базу данных SQL, очистите его для SQL.   -  person bucabay    schedule 23.10.2009
comment
comment
Всем спасибо за помощь / совет! Похоже, мне нужно переосмыслить свой процесс. :-)   -  person tscully    schedule 23.10.2009


Ответы (5)


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

person ryeguy    schedule 22.10.2009

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

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

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

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

person Andrew    schedule 22.10.2009
comment
о, это круто! я такого раньше не видел :) - person Mickey; 23.10.2009
comment
это лучший метод, если у вас есть php5 - person robjmills; 23.10.2009

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

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

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

person robjmills    schedule 22.10.2009

снятые флажки не отправляются на сервер.

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

person w35l3y    schedule 22.10.2009

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

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

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

person Ben James    schedule 22.10.2009
comment
Еще хуже, если у вас нет уже инициированного подключения к базе данных. - person alex; 23.10.2009
comment
У меня соединение установлено прямо над вызовом функции, но вам, ребята, не нужно видеть, что у меня там есть. ;-) - person tscully; 23.10.2009
comment
см. php.net/manual/en/security.magicquotes.php - person bucabay; 23.10.2009