代码之家  ›  专栏  ›  技术社区  ›  personaelit

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

  •  8
  • personaelit  · 技术社区  · 16 年前

    我们都知道,参数化SQL是处理用户输入和动态SQL的方法,但是如果您要查找的输入是数字的,那么将字符串转换为int(或double、long或诸如此类)是否有效?

    我想我要问的是,在SQL注入方面,仅此一项技术是否是可靠的?

    4 回复  |  直到 16 年前
        1
  •  10
  •   LukeH    16 年前

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

    但是为什么要冒险呢?使用参数化SQL,您不必担心它。

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

        2
  •  2
  •   Richard Knop    16 年前

    如果在将字符串强制转换为整数“是”之前字符串是一个有效数字,那么它是安全的。但在将其强制转换为int之前,必须确保它是有效的整数。

    我不知道您使用的是什么服务器端语言,但在PHP中,您可以使用的是\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();
    }
    
        3
  •  1
  •   Sheff    16 年前

    它在防止SQL注入方面是安全的,但在您得到异常时并不是一个好主意,如果可能的话,您总是希望避免这种情况,因为异常是昂贵的。您应该正确地清理输入。当然,用户仍然可以将该值更改为Int32值内的任何范围。

        4
  •  1
  •   BradC    16 年前

    可能 但值得测试。

    关于Richard的答案,我有时会遇到IsNumeric()比实际的数字转换(实际上取决于本地化设置)更自由一些,因为它将接受有效的数字。诸如“-0”、“3e-5”、“5.000.000”之类的东西有时会满足于数字,但不能正确铸造。所以我通常会做一个完整的尝试,而不是围绕实际的强制转换语句。