【问题标题】:PHP Security - (int) vs FILTER_VALIDATE_INTPHP 安全性 - (int) 与 FILTER_VALIDATE_INT
【发布时间】:2011-06-14 22:44:50
【问题描述】:

我最近被告知有 FILTER_VALIDATE_INT 顺便说一句很棒。

我的问题是从网站获取一个整数值,无论它可能来自用户还是从 Web 应用程序生成,并通过查询字符串传递。

值(整数)可以在mysql查询中显示或使用。

我正在尝试为此构建最佳的安全方法。

考虑到这一点,简单地使用是否安全

$myNum = (int)$_GET['num'];

或者

if (filter_var($_GET['num'], FILTER_VALIDATE_INT)) $myNum = $_GET['num'];

另外,请解释一下使用(int)FILTER_VALIDATE_INT有什么区别

【问题讨论】:

  • 为了扩展现有的答案,FILTER_SANITIZE_NUMBER_INT 等同于 (int) 转换。
  • @mario,你怎么能这么说?不是。
  • 这是一个有趣的注释,FILTER_VALIDATE_INT 说 '0011' 不是 int 但 '1111' 是 int。你知道的越多……

标签: php variables input filter


【解决方案1】:

不同之处在于,转换为int 总是会得到int,它可能是也可能不是原始值。例如。 (int)'foobar' 导致 int 0。这使得它对于大多数 SQL 用途来说是安全的,但与原始值无关,您甚至都不知道它。

filter_varFILTER_VALIDATE_INT 告诉你的值是否是一个int,根据它你可以决定在 SQL 查询中使用它还是向用户。

【讨论】:

  • @deceze 您是否知道filter_var 与其对应的is_int 之间是否存在很大差异?
  • @Russell Dias:至少'42' 的结果(整数表示为字符串)。
  • @zerkms 哎呀没有意识到它也测试了一个数字字符串。感谢您的示例;)
  • 知道了。现在说得通了。谢谢!
  • @deceze FILTER_VALIDATE_INT 似乎也适用于从表单提交的字符串,因此它的工作方式与您描述的略有不同。
【解决方案2】:
 <input type="text" name="param"></input>


$price = filter_input(INPUT_POST, 'param', FILTER_VALIDATE_INT);
if ($price !== false) {
print " a number.";    //works when value is number
}


if(is_int($_POST['param'])){
    print "is number."; //don't works when value is number
}

当 value 为 number 时,请尝试测试。

【讨论】:

    猜你喜欢
    • 2015-08-02
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2010-10-09
    相关资源
    最近更新 更多