2010-06-30 15 views
6

Donc je me demandais est-ce suffisant pour être sûr que l'utilisateur ne fera pas d'injections SQL et le nombre sera seulement et toujours entier? La fonction $ id dans la fonction getArticle est liée à la requête SQL.Est-ce que (int) et is_int() sont sécurisés pour protéger contre les injections SQL?

<?php $id = (isset($_GET['id']) && is_int((int)$_GET['id'])) ? (int)$_GET['id'] : false ?> 
<?php $news = $class->getArticle($id) ?> 

Comme loin j'ai testé cela a bien fonctionné, mais comme je ne suis pas totalement sûr je vous demande plutôt guyz! Ok, les gens disent que les déclarations préparées feraient l'affaire. Ils le feraient vraiment? Comme, puis-je être totalement sûr que si bind bind comme entier, il sera entier rien d'autre?

Merci d'avance!

+2

Je pense que le test de 'is_int ((int) [N'IMPORTE QUELLE])' retournera toujours 'true' et est donc redondant. Utilisez 'is_numeric' pour tester si quelque chose ** peut être converti en ** un' int', puis utilisez '(int)' pour effectuer la conversion. Ou laissez la première étape, car (int) va créer un «int» de 0 sur des valeurs non reconnaissables. – MvanGeest

+0

méfiez-vous si votre paramètre $ _GET vient d'un formulaire | bool is_int (mélange $ var) | Trouve si le type de la variable donnée est entier. Remarque: Pour tester si une variable est un nombre ou une chaîne numérique (telle que l'entrée de formulaire, qui est toujours une chaîne), vous devez utiliser is_numeric(). – Redlab

Répondre

10

Vous pouvez simplement taper les jeter dans le type approprié:

$number = intval($_GET['id']); 
$string = mysql_real_escape_string(strval($_GET['str'])); 

Pour vous assurer que vous obtenez ce que vous attendez.

La meilleure solution est d'utiliser Prepared statements pour éviter l'injection de sql.

+0

Ref: http://php.net/manual/fr/function.mysql-real-escape-string.php –

+7

D'accord, pourquoi ne pas simplement utiliser * Les instructions préparées * et oublier la vérification des paramètres. –

+0

Oui, comme je l'ai dit, je lierai plus tard les params à la requête sql, mais va-t-il vraiment faire ce qu'il doit faire? Je veux dire: bind_param ('i', $ id); fera l'affaire? – Rihards

0

Je ne vois pas comment cela peut être utilisé pour une injection SQL. Donc je dirais que c'est assez sécurisé.

0

il suffit d'utiliser:

$id=(int)@$_GET['id']; 

si $ _GET [ 'id'] n'est pas défini $ id sera 0.
si vous voulez tester si id est utilisé correctement réglé:

if ($id=(int)@$_GET['id']){ 
    // 
} else { 
    //invalid id 
} 
5

Utilisez les instructions préparées. Il n'y a aucune raison de ne pas les utiliser. Ensuite, vous n'avez pas à demander "Est-ce assez bien?"

+0

Si l'entrée est convertie en nombre, je sais que c'est "assez bon". Et s'il est plus facile d'ignorer les instructions préparées (création de requêtes avec WHERE IN) ou plus performant (en faisant un lot massif d'insertion dans une requête), il y a des raisons de ne pas les utiliser. –