PHP is_int 未按预期执行

Posted

技术标签:

【中文标题】PHP is_int 未按预期执行【英文标题】:PHP is_int is not performing as expected 【发布时间】:2012-01-22 19:25:28 【问题描述】:

我有一个页面 (index.php),它从 URL 中获取 GET 变量并出于安全目的对其进行检查。这个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");

?>

【问题讨论】:

我不知道你是否已经知道,但你应该在header(..) 之后添加一个exit();。否则脚本会继续打印页面内容。 阅读the documentation 会告诉你,is_int() 检查变量的类型,所以带有“123”的字符串到is_int() 不会返回true,因为这是字符串.还有你为什么用http-status-code-404标记你的帖子? @Tadeck 标记已删除。谢谢你的文件。我现在正在使用 is_numeric,但它仍然无法正常工作 @amir75 你是对的。有效!如果我改用die(); 可以吗? 【参考方案1】:

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

试试is_numeric()

【讨论】:

还有ctype_digit() 表示只包含数字的字符串。 @alien 我已经更新了我当前的代码,我得到了和以前一样的行为:[ 尝试将ob_start;更改为ob_start(); @AlienWebguy 当我用die("test") 代替标题时,它工作得很好。我的标题一定有问题。我必须在我的服务器上设置 404 页面吗? 您可以在您的 .htaccess 中轻松做到这一点:ErrorDocument 404 /notfound.html【参考方案2】:

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

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

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

【讨论】:

想一想,AlienWebguy 的答案可能会更好,因为您将能够过滤掉任何“奇怪”的值......【参考方案3】:

有时您想验证应该是数字的输入,但在$_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() 函数,但它在原始版本中仍然可能有用。

【讨论】:

以上是关于PHP is_int 未按预期执行的主要内容,如果未能解决你的问题,请参考以下文章

Apache Rewrite 规则未按预期工作

vbscript 未按预期执行

Mandelbrot 集函数未按预期执行

Office.FileDialog 未按预期执行

ViewController 未按预期执行 segue

Nodejs 代码未按预期执行