我们都知道参数化SQL是处理用户输入和动态SQL时的方法,但如果您要搜索的输入是数字,则从字符串转换为int(或double,或long,或其他)有效?
我想我要问的是,就SQL注入而言,这项技术是否绝对可靠?
答案 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,但是没有正确投射。所以我通常会做一个完整的尝试,改为抓住实际的演员陈述。