web-dev-qa-db-fra.com

quelle est la bonne méthode pour aseptiser l'ensemble du tableau $ _POST en php?

J'ai un formulaire avec beaucoup de variables qui envoie ensuite un e-mail, plutôt que de nettoyer chaque valeur de $_POST Avec filter_var($_POST['var'], FILTER_SANITIZE_STRING); J'étais après un morceau de code plus simple. J'ai trouvé ce qui suit, qui semble fonctionner car je pense que l'action par défaut est FILTER_SANITIZE_STRING, Mais je me demandais simplement ce que les gens pensent, et si ce n'est pas une bonne pratique, vous pourriez peut-être me dire pourquoi? Les valeurs $_POST Sont ensuite incorporées individuellement dans de nouvelles variables, donc je n'utiliserais array_map qu'au début pour tout nettoyer ...

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

Merci pour vos réponses, pour vous donner un peu plus d'informations, essentiellement:

J'ai 20-30 champs de saisie dans un formulaire qui sont capturés, les données sont ensuite affichées à l'utilisateur pour vérifier leur entrée, les variables sont ensuite filtrées, l'utilisateur est ensuite envoyé un e-mail et enfin les détails sont saisis dans une base de données .

actuellement, je nettoie en utilisant la fonction array_map ci-dessus, ainsi que FILTER_SANITIZE_EMAIL sur l'adresse e-mail avant d'envoyer un e-mail, puis échapper l'entrée en utilisant mysql_real_escape_string () avant l'insertion dans la base de données. Sans entrer dans les déclarations préparées, etc. pensez-vous que je devrais faire quelque chose de plus? Merci encore!

32
SirG

Si le type de chacune de vos variables d'entrée est une chaîne et que vous souhaitez les nettoyer toutes en même temps, vous pouvez utiliser:

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

Cela nettoiera vos tableaux $ _GET et $ _POST.

Vu ici: PHP -Analyse des valeurs d'un tablea

73
johnny.rodgers

Cela dépend de son utilisation.

Si vous l'insérez dans la base de données, alors mysql_real_escape_string() pour les chaînes entre guillemets et la conversion de type pour les nombres serait la voie à suivre - des instructions bien préparées, mais c'est une tout autre affaire.

Si vous prévoyez de sortir les données sur la page Web, je recommanderais quelque chose comme htmlspecialchars()

Si vous prévoyez d'utiliser l'entrée utilisateur comme argument Shell, vous utiliserez alors escapeshellarg()

Passons à votre question sur l'envoi d'e-mails. Eh bien, ce qui suit devrait suffire:

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

Tout cela ne fait que supprimer les balises et encoder les caractères spéciaux.

19
Russell Dias

Il n'y a pas de bonne façon de procéder à l'assainissement des couvertures. La méthode d'assainissement dont vous avez besoin dépend de ce qui est fait aux données.

Désinfectez les données directement avant leur utilisation.

5
Pekka 웃

C'est ce que j'utilise dans tous mes projets:

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;
}

Il permet de couper et d'assainir un tableau imbriqué de données publiées

2
ymakux

Pour appliquer des filtres spécifiques sur plusieurs champs, utilisez une instruction 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;
    }
}

Remarque: Mon IDE (NetBeans) met en garde contre l'utilisation globale de $_POST N'importe où comme violation de sécurité, donc je viens de prendre l'habitude d'utiliser un $post à la place. Si vous choisissez de ne pas effectuer d'abord l'assainissement de la chaîne de couverture, FILTER_SANITIZE_STRING pourrait être utilisé pour le cas default:.

0
OXiGEN