filter_var是否足以清理基于PHP的MySQL查询的整数输入?

时间:2008-11-22 05:35:16

标签: php mysql validation

我从来不喜欢包装

mysql_real_escape_string 

围绕输入的函数我期望在MySQL查询中包含整数。 最近我遇到了

filter_var 

功能。尼斯!

我目前正在使用代码:

if (isset($idUserIN) 
    && filter_var($idUserIN, FILTER_VALIDATE_INT) 
    && 0 < filter_var($idUserIN, FILTER_SANITIZE_NUMBER_INT)
    ) {
      $idUser = filter_var($idUserIN, FILTER_SANITIZE_NUMBER_INT);
      $sql = 'SELECT * FROM TABLE_NAME WHERE idUser = '.$idUser;
} else {
  // handle invalid data
}

这是否会打开任何漏洞?

('&gt; 0'选择而非'&gt; = 0'作为表auto_increment字段,因此0不是正常值)

3 个答案:

答案 0 :(得分:2)

我自己会为该任务创建一个函数,可能在某个静态类中,

public static function escape_int($i) {
    $sanitised = intval($i); 
    if( '_' . $sanitised . '_' === '_' . $i . '_'  && $sanitised > 0 ) {
        return $sanitised;
    }
    throw new IntegerEscapeException( $i, $sanitised );
    return "ENOINT"; # Wont Run This, but I prepare for the impossible. 
}

try { 
    $sql = 'SELECT * FROM TABLE_NAME WHERE idUser = ' . DB::escape_int( $userid ); 
    DB::query($sql); 
    ...etc...
} catch( IntegerEscapeException $e ) { 
    die ( "You shot the sherif!" ); # bad example.
}

这很好,因为如果我发现我的卫生方法,我可以稍后修复它。

答案 1 :(得分:1)

我使用的一种更简单,更易于阅读的方法是:

$sql = 'SELECT * FROM TABLE_NAME WHERE idUser = ' . intval($idUser);

它尝试将$ idUser转换为整数,并且在失败时返回0,我的所有表都没有作为真实id。 (所以我知道如果评估为0,则输入无效。)

要回答你的实际问题,不会留下任何漏洞。我建议尽量摆脱重复的代码:

$idUserIN_filtered = filter_var($idUserIN, FILTER_VALIDATE_INT);

if (isset($idUserIN) 
    && $idUserIN_filtered 
    && 0 < $idUserIN_filtered
    ) {
      $sql = 'SELECT * FROM TABLE_NAME WHERE idUser = '.$idUser_filtered;
} else {
  // handle invalid data
}

答案 2 :(得分:0)

这就是你所需要的一切

if ($idUser = filter_var($idUserIN, FILTER_VALIDATE_INT)) {
      $sql = 'SELECT * FROM TABLE_NAME WHERE idUser = '.$idUser;
} else {
  // handle invalid data
}

if ($idUser = filter_input(INPUT_POST, 'userId', FILTER_VALIDATE_INT)) {

或者你可以检查它在MVC中是否无效。

if (!$idUser = filter_var($idUserIN, FILTER_VALIDATE_INT)) {
      throw new InputParameterException('UserId');
}
//else its valid