2008-11-22 6 views
1

Je ne l'ai jamais aimé envelopper la fonctionEst-ce que filter_var est suffisant pour nettoyer l'entrée entière pour les requêtes MySQL PHP?

mysql_real_escape_string 

autour de l'entrée, je pense être entier à inclure dans une requête MySQL. Récemment, je suis tombé sur le

filter_var 

fonction. Agréable!

J'utilise actuellement le code:

if (isset($idUserIN) 
    && filter_var($idUserIN, FILTER_VALIDATE_INT) 
    && 0 < filter_var($idUserIN, FILTER_SANITIZE_NUMBER_INT) 
    ) { 
     $idUser = filter_var($idUserIN, FILTER_SANITIZE_NUMBER_INT); 
     $sql = 'SELECT * FROM TABLE_NAME WHERE idUser = '.$idUser; 
} else { 
    // handle invalid data 
} 

Est-ce laisser des trous ouverts?

(« > 0 » choisi plutôt que « > = 0 » comme une table champ auto_increment, de sorte que 0 ne serait pas une valeur normale)

Répondre

1

beaucoup plus simple et plus facile à lire méthode que j'utilise est la suivante:

$sql = 'SELECT * FROM TABLE_NAME WHERE idUser = ' . intval($idUser); 

Il tente de convertir idUser de $ à un nombre entier et sur les déclarations de défaillance 0 qui aucun de mes tableaux ont comme de vrais d'id. (Donc, je sais que l'entrée était invalide si elle est évaluée à 0.)

Pour répondre à votre question, non, cela ne laissera aucun trou ouvert. Je suggère de se débarrasser du code répétitif si:

$idUserIN_filtered = filter_var($idUserIN, FILTER_VALIDATE_INT); 

if (isset($idUserIN) 
    && $idUserIN_filtered 
    && 0 < $idUserIN_filtered 
    ) { 
     $sql = 'SELECT * FROM TABLE_NAME WHERE idUser = '.$idUser_filtered; 
} else { 
    // handle invalid data 
} 
2

Je me créerais une fonction pour cette tâche, peut-être dans une classe statique quelque part,

public static function escape_int($i) { 
    $sanitised = intval($i); 
    if('_' . $sanitised . '_' === '_' . $i . '_' && $sanitised > 0) { 
     return $sanitised; 
    } 
    throw new IntegerEscapeException($i, $sanitised); 
    return "ENOINT"; # Wont Run This, but I prepare for the impossible. 
} 

try { 
    $sql = 'SELECT * FROM TABLE_NAME WHERE idUser = ' . DB::escape_int($userid); 
    DB::query($sql); 
    ...etc... 
} catch(IntegerEscapeException $e) { 
    die ("You shot the sherif!"); # bad example. 
} 

Ce qui est bon parce que si je découvre mon assainissement méthode reeks je peux le réparer plus tard.

0

Ceci est tout ce que vous devez

if ($idUser = filter_var($idUserIN, FILTER_VALIDATE_INT)) { 
     $sql = 'SELECT * FROM TABLE_NAME WHERE idUser = '.$idUser; 
} else { 
    // handle invalid data 
} 

ou

if ($idUser = filter_input(INPUT_POST, 'userId', FILTER_VALIDATE_INT)) { 

Sinon, vous pouvez vérifier si son non valide dans le MVC.

if (!$idUser = filter_var($idUserIN, FILTER_VALIDATE_INT)) { 
     throw new InputParameterException('UserId'); 
} 
//else its valid 
Questions connexes