9

我有一个页面(index.php),它GET从 URL 中获取一个变量并出于安全目的对其进行检查。这个GET变量应该只是一个整数。我正在使用以下代码来检查这一点,但在所有情况下,无论是否为整数,我都会得到 index.php 页面。标题永远不会出现。html在此代码之后,页面的其余部分以标记开头。

PHP:

<?php ob_start(); session_start();
$q=trim($_GET['q']);
if (!is_numeric($q)){
header("HTTP/1.0 404 Not Found");
}
?>
4

3 回答 3

28

如果它在查询字符串中传递,它将不是整数。

尝试is_numeric()

于 2012-01-22T19:26:31.163 回答
4

有一种更好的方法可以做到这一点,即强制转换为 int:

$q = (int) $_GET['q'];

is_int行为符合预期。因为 GET 参数始终是字符串。尝试 var_dumping 他们。

于 2012-01-22T19:28:09.057 回答
1

有时您想验证应该是数字但输入的输入,$_GET否则$_POST您会将其作为字符串获取。is_numeric()可能有问题,因为它允许十六进制、二进制和八进制格式(来自手册):

Thus +0123.45e6 is a valid numeric value. Hexadecimal (e.g. 0xf4c3b00c), Binary (e.g. 0b10100111001), Octal (e.g. 0777) notation is allowed too but only without sign, decimal and exponential part.

您不能使用is_int()它,因为它仅用于整数值(不是字符串!)所以...您可以通过这种方式验证字符串和整数的数字:

/**
 * Validate integer.
 */
class IntegerValidator
{
    /**
     * Run validation.
     * @param string $value
     * @return bool
     */
    public static function isIntVal(string $value): bool
    {
        if (!self::hasValidIntegerFormat($value)) {
            return false;
        }

        return !self::hasLeadingZero($value);
    }

    /**
     * Check if given string looks like valid integer. Negative numbers allowed.
     * @param string $value
     * @return bool
     */
    private static function hasValidIntegerFormat(string $value): bool
    {
        return (bool) preg_match('/^-?[0-9]+$/', $value);
    }

    /**
     * Check if given number has leading 0. Thus it's invalid integer.
     * @param string $number
     * @return bool
     */
    private static function hasLeadingZero(string $number): bool
    {
        return self::extractFirstDigit($number) === 0;
    }

    /**
     * Extract first digit from given number.
     * @param string $number
     * @return int
     */
    private static function extractFirstDigit(string $number): int
    {
        return self::isNegativeInteger($number)
            ? (int) $number[1]
            : (int) $number[0];
    }

    /**
     * Check if number is negative integer. ie. starts with minus sign on the beginning.
     * @param string $number
     * @return bool
     */
    private static function isNegativeInteger(string $number): bool
    {
        return $number[0] === '-';
    }
}

var_dump(IntegerValidator::isIntVal('123'));   // true
var_dump(IntegerValidator::isIntVal('0123'));  // false
var_dump(IntegerValidator::isIntVal('-0123')); // false
var_dump(IntegerValidator::isIntVal('-123'));  // true

也可以使用override_function()覆盖 is_int() 函数,但它在原始版本中仍然可能有用。

于 2014-04-21T12:18:50.403 回答