我是否必须使用mysqli_real_escape_string转义输入,即使我使用is_numeric检查它以防止sql注入

时间:2014-10-09 02:04:18

标签: php mysqli sql-injection

我使用$_GET['id']来获取id并在db中查找。

我的印象是,如果我使用is_numeric函数来检查字符串是否为数字,那么我不必使用mysqli_real_escape_string来转义输入。但最近发现了这个。

  

查找给定变量是否为数字。数字字符串组成   可选符号,任意位数,可选小数部分和   可选的指数部分。因此+ 0123.45e6是有效的数值。   十六进制(例如0xf4c3b00c),二进制(例如0b10100111001),八进制   (例如0777)也允许表示法,但只有没有符号,小数和   指数部分。   参考:http://php.net/manual/en/function.is-numeric.php

所以我的问题是 我是否必须使用mysqli_real_escape_string转义输入,即使我使用is_numeric检查它以防止sql注入

因为输入将只是数值,例如。 555,222,456,879

1 个答案:

答案 0 :(得分:3)

虽然我无法想出一个特定的方法来攻击你的榜样,但我不能想到一种方式" !="不可能"。

如果你养成了检查,然后传递价值的习惯,最终你会陷入麻烦!

您的陈述"输入将只是数字值,例如。 555,222,456,879和#34;显然不是真的,因为你在报价中给出了一些更复杂的例子 - SQL如何处理+ 0123.45e6或0b10?包含数字的字符串与数字不同。

出于这个原因,总是 USE PREPARED 声明 - 这样你就不必担心它。 +1到@Ohgodwhy。

如果你能找到不使用准备好的陈述的理由(而且我认为没有准备好的陈述!)那么就说吧。