SQL注入保护 - 从字符串转换为int

时间:2009-09-08 14:53:58

标签: sql-injection

我们都知道参数化SQL是处理用户输入和动态SQL时的方法,但如果您要搜索的输入是数字,则从字符串转换为int(或double,或long,或其他)有效?

我想我要问的是,就SQL注入而言,这项技术是否绝对可靠?

4 个答案:

答案 0 :(得分:10)

我不是专家,但我有理由相信这是安全的。

但为什么要冒这个机会呢?使用参数化SQL,您无需担心它。

此外,参数化SQL还有其他优点,而不仅仅是注入保护。

答案 1 :(得分:2)

如果字符串是有效数字,然后将其转换为整数,则可以安全。但是在将它转换为int之前,你必须确保它是一个有效的整数。

我不知道您使用的是哪种服务器端语言,但在PHP中您可以使用is_numeric()函数。例如:

$strYouExpectToBeInt = $_POST['id'];
try {
    if (false === is_numeric($strYouExpectToBeInt)) {
        throw new Exception('id is not a numeric string or a number');
    }
    $strYouExpectToBeInt = (int)$strYouExpectToBeInt;
    if (false === is_int($strYouExpectToBeInt)) {
        throw new Exception('id is not a valid integer');
    }

    // everything is ok, you can use $strYouExpectToBeInt
    // in SQL query now

} catch  (Exception $e) {
    echo $e->getMessage();
}

答案 2 :(得分:1)

关于sql注入预防是安全的,但是当你得到异常时并不是一个好主意,如果可能的话,你总是希望避免,因为例外是昂贵的。你应该真正正确地消毒输入。当然,用户仍然可以将值更改为int32值中的任何范围。

答案 3 :(得分:1)

可能,但值得测试。

关于理查德的答案,我有时遇到麻烦,IsNumeric()在接受有效数字方面比实际CAST更接近数字(实际上取决于本地化设置)。像“-0”,“3E-5”,“5.000.000”这样的东西有时会满足IsNumeric,但是没有正确投射。所以我通常会做一个完整的尝试,改为抓住实际的演员陈述。