Я привык полагаться на is_numeric()
чтобы убедиться, что данные, передаваемые от пользователей, являются числовыми. Я недавно обнаружил, что пользователи также могут передавать данные 0xFF
(hexdec = 255).
Я хотел бы запретить все, что не является целым числом (и не шестнадцатеричным представлением).
Вот что я пробовал до сих пор.
$i_haxors_u = $_GET['id'];
$regex = '/[0-9]*/';
if (!empty($i_haxors_u) && !preg_match($regex, $i_haxors_u))
{
echo '<p>Invalid $i_haxors_u ' . strip_tags($i_haxors_u);
} else {
echo '<p>$i_haxors_u is numeric... maybe.';
}
Это по-прежнему дает такие значения, как 0xFF
пропуск. Как разрешить только не шестнадцатеричные числа?
ОБНОВЛЕНИЕ 12 ноября 2014.
Обратите внимание, что выбранный ответ отлично работает для данных, передаваемых через GET, но не будет работать, если для переменной задано шестнадцатеричное значение.
$x = 0xFF;
if (is_numeric($x))
{
echo "<p>$x is a number.";
} else {
echo "<p>$x is not a number.";
}
if (preg_match('/^[\d]+$/',$x))
{
echo "<p>$x is a number.";
} else {
echo "<p>$x is not a number.";
}
$x = '0xFF';
if (is_numeric($x))
{
echo "<p>$x is a number.";
} else {
echo "<p>$x is not a number.";
}
if (preg_match('/^[\d]+$/',$x))
{
echo "<p>$x is a number.";
} else {
echo "<p>$x is not a number.";
}
Печать
255 is a number.
255 is a number.
0xFF is a number.
0xFF is not a number.
используйте не-цифры в вашем регулярном выражении: $ regex = ‘/ \ D /’;
принять ошибку и пройти при подтверждении того, что на входе нет цифр.
следующий код завершается успешно при id = 7, дает сбой при id = 7.2, 7.2x, ffff, 0xff, -1
$id = $_GET['id'];
//assuming failure:
$valid = false;
if (!preg_match('/\D/',$id)) { $valid = true; } //fail if containing non-digitif ($valid) {
echo "$id provided is valid";
}
else {
echo "$id provided is not valid";
}
Вы должны использовать якоря и использовать +
квантификатор, разрешающий только целые числа:
$regex = '/^\d+$/';
С помощью +
квантификатор также позволит вынуть !empty($i_haxors_u)
состояние с \d+
будет применять 1 или более цифр.
Это просто потому, что вы должны проверить все числа:
$regex = '/^[0-9]+$/';
нет необходимости тестировать пустой с +