Voici mon code:
<?php
$id = $_GET["id"];
if (is_int($id) === FALSE) {
header('HTTP/1.1 404 Not Found');
exit('404, page not found');
}
?>
7 Réponses :
dans une pincée, vous pouvez lancer dans un entier, puis vérifier! = 0. p> is_int code> vérifie que le type Type de données em> est un entier, mais tout dans $ _ get code> sera une chaîne . em > Par conséquent, il retournera toujours faux code>. $id = isset($_GET['id']) ? (int) $_GET['id'] : null;
if (!$id) { // === 0 || === null
header('HTTP/1.1 404 Not Found');
exit('404, page not found');
}
A manqué de upvotes pour la journée, mais cette réponse dit en fait la raison pour laquelle utiliser IS_Numeric. Tout paramètre de requête HTTP envoyé par courrier ou obtenir sera toujours une chaîne.
+1 - cependant à mentionner, is_numeric code> n'a pas le même effet, tel que par exemple. laisse également passer des valeurs heex à part les autres (voir php.net)
@Helmut, oui, is_numeric () code> n'est pas correct pour la vérification des identifiants entier. En pratique, toutes les entrées de l'utilisateur doivent être transmises via filtre_var () code> ou une autre routine explicite de la même manière.
Entrée de l'utilisateur en $ _GET TRAMA (ainsi que les autres superglobaux) prennent la forme de chaînes. p>
is_int code> vérifie le type type em> (ie String code>) de la valeur, non si elle contient des valeurs d'entier. Pour vérification que l'entrée est une chaîne entière, je suggérerais quelque chose comme ctype_digit code> ou Un entier filtre ( filtre_validate_int code> -C'est-ce que l'avantage de modifier réellement la valeur en entiers ). Bien sûr, vous pouvez également le tyroser avec (int) code>. P>
de la documentation PHP pour IS_INT: P>
Remarque: Pour tester si une variable est un nombre ou une chaîne numérique (telle que Entrée de formulaire, qui est toujours une chaîne), Vous devez utiliser IS_Numeric () . P> blockQuote>
Toute entrée utilisateur est entrée en tant que chaîne, car PHP n'a aucun moyen de dire quel type de données vous attendez que les données soient.
le jeter à un entier ou utilisez une regex si vous voulez vous assurer que c'est un entier. p>
essayez d'utiliser is_numérique code> au lieu de is_int code>. is_numérique code> vérifie si elle est donnée quelque chose qui peut être un nombre ( $ _ obtenir code> renvoie les chaînes que je pense). is_int code> vérifie pour voir si la variable est de type int code> p>
ou, vous pouvez simplement utiliser une correspondance de regex pour vérifier si la chaîne est un entier.
if(preg_match('/^\d+$/',$_GET['id'])) {
// is an integer
}
Et
$ _ obtenez code> contient en fait ... Quoi?