【问题标题】:FILTER_VALIDATE_INT validates URL encoded values as INT [closed]FILTER_VALIDATE_INT 将 URL 编码值验证为 INT [关闭]
【发布时间】:2015-08-02 12:35:41
【问题描述】:

为什么 query: *.php?page=%20%209999%20%20 和 id est *.php?page=%0a%0d9999%0a%0d 验证为 INT 并返回为 int(9999)

$args=array('page'=>array('filter'=>FILTER_VALIDATE_INT)));
$ret=filter_input_array(INPUT_GET,$args);

var_dump($ret['page']);

【问题讨论】:

  • 那些“URL 编码值”只是空格%20 和换行符%0A
  • @mario 对,但是从什么时候开始空格和换行符是整数?
  • FILTER_VALIDATE_INTintval() 没有太大区别。它不会断言字符串是全数字的,它只是探测整数。
  • @mario 我明白了。我想在devpage上有点模糊。 =(
  • 是的,过滤器模块是一个不错的想法,API 和文档有些笨拙,偏离了一些实现细节:]

标签: php security filtering sanitization filter-var


【解决方案1】:

编码后的网址是:

*.php?page=%20%209999%20%20

解码后的网址是:

*.php?page=  9999  

因此你观察到int(9999)%20%0A 分别是空格和换行符。可以通过以下代码观察到这种行为:

$_GET["page"] = "  9999  ";
$name = filter_var($_GET["page"], FILTER_VALIDATE_INT);
var_dump($name);

int(9999)

那些 URL 编码的空格和中断在到达您的过滤器之前会被 urldecode,而FILTER_VALIDATE_INT 对空格的要求并不那么严格。

调整过滤器的一种方法是使用callback 来更严格地进行整数测试:

$_GET["page"] = "  9999   ";

function FILTER_VALIDATE_STRICT_INT($val) {
    return intval(urlencode($val)) === intval($val) ? intval($val) : false;
}

$args=array(
    'page'=>array(
        'filter'=>FILTER_CALLBACK,
        'options'=>"FILTER_VALIDATE_STRICT_INT"));
$ret=filter_var_array($_GET, $args);

var_dump($ret['page']);

返回

布尔(假)

【讨论】:

  • 这更像是一种观察,你不同意吗?马里奥已经在 cmets 中说明了这一点。
  • “为什么查询:...验证为 INT 并返回为 int(9999)”——这就是问题所在。
  • 好吧,然后……OP确实问为什么……所以……他们从来没有问过如何解决它,哈哈……你说得对; -)
  • 我会尽力帮助他...
  • FILTER_VALIDATE_INT 可能没有我们想象的那么严格。我在回答中为您提供了一个解决方案,因为这是一个有趣的问题。
猜你喜欢
  • 2020-05-09
  • 2022-12-11
  • 2011-08-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
相关资源
最近更新 更多