IS乘以1是一种安全的方法来清除数字值与sql注入?

时间:2011-11-12 15:57:56

标签: php mysql sql-injection

我想知道,如果我知道一个值应该是数字,那么将它乘以一个安全的方法来清理它吗?

function x($p1){
   $p1*=1;
   sql="select * from t where id ={$p1}";
   //run query..
}

虽然我的例子使用了一个ID,但是我的应用程序中有很多类型的数值(可以是钱,也可以是pai等)。

6 个答案:

答案 0 :(得分:2)

我不明白为什么不会这样。但是使用预准备语句有什么问题?这总是比在SQL语句中直接使用PHP变量更安全。

答案 1 :(得分:2)

您可以使用is_numeric()

答案 2 :(得分:0)

我确信有更“合适”的方式,但对于你问题的范围,我会说是的。如果传递某种字符串,PHP在进行数学运算时会将其解释为零。

答案 3 :(得分:0)

您也可以使用is_int()

答案 4 :(得分:0)

虽然这可能有用,但intval似乎是一个更好的解决方案。 http://php.net/manual/en/function.intval.php。对于阅读代码的其他人来说,你的意图可能会更明显。

如果要在将值转换为int之前检查值是否为数字,请使用is_numerichttp://php.net/manual/en/function.is-numeric.php)。它会检查数字和整数的字符串。例如,如果一个数字是通过AJAX从文本输入表单返回的,那么它可能是一个字符串。在这种情况下,is_int将返回false,但is_numeric将返回true。

修改

现在我知道你使用DECIMAL作为MySQL列类型,你可以这样做:

function getItem($pValue)
{

    if (!is_numeric($pValue))
    {
        return false;
    }

    $Query = sprintf
    (
        'SELECT * FROM %s WHERE %s = %.2f',
        'TableName',
        'Price',
        $pValue
    );
    // Do something with $Query
}

答案 5 :(得分:0)

它大部分时间都有效,因为它会将字符串转换为整数或双精度,但你必须要小心。它可以正常用于标量值。但是,如果你这样做:

x(new stdClass);

你会得到E_NOTICE。这不是那么糟糕吧?这样:

x(array());

您将获得E_ERROR不支持的操作数类型,并且脚本终止。

也许你认为它不是那么糟糕,但是在不合时宜的时刻发生的致命错误可能会使你的系统处于不稳定状态,例如,失去参照完整性或者一系列查询未完成。

只有你知道是否会发生上述情况。但如果这些数据以任何方式来自用户,我会在这个问题上采用墨菲定律而不信任它。