web-dev-qa-db-fra.com

fonction pour nettoyer les entrées de la base de données Mysql

J'essaie de mettre en place une fonction à usage général qui nettoiera l'entrée d'une base de données Mysql. Jusqu'à présent, voici ce que j'ai:

function sanitize($input){
    if(get_magic_quotes_qpc($input)){

        $input = trim($input); // get rid of white space left and right
        $input = htmlentities($input); // convert symbols to html entities
        return $input;
    } else {

        $input = htmlentities($input); // convert symbols to html entities
        $input = addslashes($input); // server doesn't add slashes, so we will add them to escape ',",\,NULL
        $input = mysql_real_escape_string($input); // escapes \x00, \n, \r, \, ', " and \x1a
        return $input;
    }
}

Si j'ai compris la définition de get_magic_quotes_qpc(). Ceci est défini par le serveur php pour échapper automatiquement les caractères au lieu d'avoir à utiliser addslashes().

Ai-je utilisé addslashes() et mysql_real_escape_string() correctement ensemble et y a-t-il autre chose que je pourrais ajouter pour augmenter la désinfection.

Merci

14
crmepham

htmlentities () n'est pas nécessaire pour sécuriser les données pour SQL. Il est utilisé lors de l'écho des valeurs de données vers la sortie HTML, pour éviter les vulnérabilités XSS. C'est également un problème de sécurité important dont vous devez être conscient, mais ce n'est pas lié à SQL.

addlashes () est redondant avec mysql_real_escape_string. Vous vous retrouverez avec des barres obliques inverses littérales dans vos chaînes dans la base de données.

N'utilisez pas de citations magiques. Cette fonctionnalité est obsolète depuis de nombreuses années. Ne déployez pas PHP code dans un environnement où les guillemets magiques sont activés. S'il est activé, désactivez-le. S'il s'agit d'un environnement hébergé et qu'ils ne désactiveront pas les guillemets magiques, obtenez un nouveau fournisseur d'hébergement.

N'utilisez pas ext/mysql. Il ne prend pas en charge les paramètres de requête, les transactions ou l'utilisation OO.

Utilisez PDO , et rendez vos requêtes plus sûres en utilisant requêtes préparées .

Pour plus de détails sur l'écriture de SQL sûr, lisez ma présentation Mythes et sophismes sur l'injection SQL .

28
Bill Karwin

Les citations magiques sont obsolètes . Désactivez-les si vous le pouvez :).

La deuxième partie addslashes et mysql_real_escape_String fait à peu près la même chose (similaire). Essayez

addslashes( '\\')
// and
mysql_real_escape_string( '\\')

Le résultat doit être \\ donc si vous utilisez

 mysql_real_escape_string( addslashes( '\\'))

tu devrais obtenir \\ (ou '\\\\' en tant que chaîne). Utiliser seulement mysql_real_escape_string (mieux) OR addslashes, jamais les deux.

Je recommande d'utiliser PDO au lieu des fonctions brutes et des échappements manuels.

5
Vyktor

Pourquoi voulez-vous appliquer des htmlentities avant d'enregistrer des données dans la base de données? Et si vous souhaitez utiliser les données pour autre chose que de simplement les écrire dans un navigateur? Par exemple pour la recherche, le partitionnement des données, l'utilisation des données dans d'autres langages de programmation, etc ...

La seule chose que vous voulez vraiment appliquer est mysql_real_escape_string (ou utilisez PDO ), rien d'autre.

Je préfère généralement annuler entièrement les effets des citations magiques. Les citations magiques sont simplement lourdes à travailler et n'auraient jamais dû être inventées. Voici un extrait du manuel PHP pour inverser les guillemets magiques:

if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}
3
Emil Vikström

la pire partie qui l'ajout de barres obliques ne désinfecte rien, quelle que soit la fonction utilisée.
et il ne doit pas du tout être utilisé comme moyen de "désinfection".

les barres obliques ne "nettoient" pas les données. Les barres obliques n'échappent que les délimiteurs de chaîne . Ainsi, la seule désinfection dont vous pouvez parler est de s'échapper et et de citer.

Sinon, si vous ne mettez pas de guillemets autour de la chaîne "filtrée", vous n'aurez aucune protection.

0
Your Common Sense