引用mysql查询中的int值

时间:2011-11-05 18:35:50

标签: php mysql

我已经养成了通过我的int函数过滤用户提交的变量的习惯,这确保它是一个数字(如果不是返回0)而不是在mysql查询中引用该变量。

这是不好的做法吗?我想我出于性能原因决定这样做。另外,我一直认为数字不应该用引号括起来。

示例:

if($perpage != $user['perpage']){
if($perpage == 50 || $perpage == 100 || $perpage == 200 ){
$DB->query("UPDATE users SET perpage=$perpage WHERE id=$user[id]", __FILE__, __LINE__);
}
}

2 个答案:

答案 0 :(得分:5)

AHA!这是一个有趣的案例!

  1. 你是对的。将数字视为数字而不是字符串

    总是更好
    • 它使您的代码更加清晰和一致
    • mysql中的strict_mode设置,如果打开,则不允许您将数字伪装为字符串。
  2. 但实际上你的实施允许注射!让我们把它留给你的作业找到它:)

  3. 以下是您的参考资料,解释此注射:http://php.net/language.types.type-juggling

    所以,我会让你的代码像这样

    $perpage = intval($perpage);
    if($perpage != $user['perpage'] && in_array($perpage,array(50,100,200) { 
      $DB->query("UPDATE users SET perpage=$perpage WHERE id=$user[id]"); 
    } 
    

答案 1 :(得分:2)

只要在使用PHP之前通过使用PHP的intval方法正确检查这些值,我就不会发现它存在问题。如果您必须与认为围绕int值的引号是语法错误的数据库进行交互,那么您可以在将来做一些好处。 (我相信MS SQL服务器可以做到这一点。)