ti-enxame.com

qual é um bom método para higienizar todo o array $ _POST no php?

Eu tenho um formulário com muitas variáveis ​​que está enviando um email, em vez de higienizar cada valor $_POST Com filter_var($_POST['var'], FILTER_SANITIZE_STRING); Eu estava buscando um código mais simples. Eu vim com o abaixo, que parece funcionar, pois acredito que a ação padrão é FILTER_SANITIZE_STRING, Mas eu estava apenas imaginando o que as opiniões das pessoas são e, se isso não é uma boa prática, talvez você possa me dizer por quê? Os valores $_POST São então incorporados individualmente a novas variáveis, então eu só usaria o array_map apenas no início para limpar tudo ...

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

Obrigado por suas respostas, para fornecer um pouco mais de informação, basicamente:

Eu tenho 20 a 30 campos de entrada em um formulário que está sendo capturado, os dados são exibidos ao usuário para verificar sua entrada, as variáveis ​​são higienizadas, o usuário recebe um email e, finalmente, os detalhes são inseridos em um banco de dados .

atualmente estou limpando usando a função array_map acima, bem como FILTER_SANITIZE_EMAIL no endereço de email antes de enviar um email e depois escapando da entrada usando mysql_real_escape_string () antes da inserção no db. Sem entrar em declarações preparadas, etc. você acha que eu deveria estar fazendo algo adicional? obrigado novamente!

32
SirG

Se o tipo de cada uma das suas variáveis ​​de entrada for uma sequência e você desejar desinfetar todas de uma vez, poderá usar:

// prevent XSS
$_GET   = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
$_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

Isso limpará suas matrizes $ _GET e $ _POST.

Visto aqui: PHP -Sanitize valores de uma matriz

73
johnny.rodgers

Depende do que está sendo usado.

Se você o estiver inserindo no banco de dados, mysql_real_escape_string() para seqüências de caracteres citadas e a conversão de tipos para números seria o caminho a seguir - instruções bem preparadas de maneira ideal, mas isso é uma questão totalmente diferente.

Se você planeja enviar os dados para a página da Web, eu recomendaria algo como htmlspecialchars()

Se você planeja usar a entrada do usuário como argumento do Shell, use escapeshellarg()

Passando para a sua pergunta sobre o envio de e-mails. Bem, o seguinte deve ser suficiente:

filter_var($_POST['message'], FILTER_SANITIZE_STRING);

Tudo isso faz basicamente strip tags e codifica caracteres especiais.

19
Russell Dias

Não existe uma maneira correta de fazer o saneamento geral. Qual método de saneamento você precisa depende do que é feito com os dados.

Limpe os dados diretamente antes de serem utilizados.

5
Pekka 웃

É isso que eu uso em todos os meus projetos:

function util_array_trim(array &$array, $filter = false)
{
    array_walk_recursive($array, function (&$value) use ($filter) {
        $value = trim($value);
        if ($filter) {
            $value = filter_var($value, FILTER_SANITIZE_STRING);
        }
    });

    return $array;
}

Permite aparar e higienizar uma matriz aninhada de dados postados

2
ymakux

Para aplicar filtros específicos em vários campos, use uma instrução switch.

$post  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

foreach($post as $k => $v) {
    switch ($k) {
        case 'int_1':
        case 'int_2':
            $post[$k] = filter_var($v, FILTER_SANITIZE_NUMBER_INT) * 1;
            break;
        case 'float_1':
        case 'float_2':
            $post[$k] = filter_var($v, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION) * 1;
            break;
        default:
            break;
    }
}

Nota: Meu IDE (NetBeans) avisa sobre o uso global de $_POST] em qualquer lugar como violação de segurança, por isso, acabei de adquirir o hábito de usar uma variável local $post Se você optar por não fazer o saneamento das cordas de manta primeiro, FILTER_SANITIZE_STRING poderia ser usado para o caso default:.

0
OXiGEN