我从来不喜欢包装
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不是正常值)
答案 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