2014-10-09 21 views
0

我使用$_GET['id']获得ID,并在数据库看看它逃脱输入。我一定使用mysqli_real_escape_string即使我检查它使用is_numeric防止SQL注入

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

查找给定的变量是否是数字。数字字符串包括可选符号 ,任意数字位数,可选小数部分和可选指数部分 。因此+ 0123.45e6是一个有效的数值。 十六进制(例如0xf4c3b00c),二元(例如0b10100111001),八通道 (例如0777)符号被允许太多,但只不带符号,十进制和 指数部分。 REF:http://php.net/manual/en/function.is-numeric.php

所以我的问题是 我是否有使用mysqli_real_escape_string即使我把它用is_numeric防止SQL注入检查逃跑输入?

作为输入将只是数值例如。 555,222456,879

+4

使用准备好的语句,避免担心它。 – Ohgodwhy 2014-10-09 02:05:23

回答

3

虽然我想不出来攻击你的例子以特定的方式,“我不能想想办法!” =“这是不可能的”。

如果你进入检查,然后传递值的习惯,最终你会惹上麻烦!

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

为此,总是使用报表 - 这样你就不必担心。 +1 to @Ohgodwhy。

如果你能找到一个理由不使用准备好的语句(我不认为这是一个!),那么让我们来谈谈。

+0

ctype_digit怎么样? – AMB 2014-10-09 02:14:37

+1

@AMB在这种特定情况下,您可以将您的值转换为整数,但为什么不使用预准备语句? – jeroen 2014-10-09 02:19:59

+0

@jeroen是的,准备好的statemetn是唯一的选择,因为我看到它,只是确保,brefore我重写应用程序。谢谢 – AMB 2014-10-09 02:21:28