应该在MySQL查询中引用来自用户输入的数字以帮助避免SQL注入攻击?应该在MySQL查询中引用来自用户输入的数字以帮助避免SQL注入攻击?
说我有一个页面上的表格,要求某人的年龄。他们进入他们的年龄,并提交。与表单提交下面的PHP代码的交易:(年龄在db表的int域)。
$Number = mysqli_real_escape_string($dbc, $_POST["age"]);
$Query = "INSERT INTO details (age) VALUES ($Number)";
$Result = mysqli_query($dbc, $Query);
取而代之的是,在那里可以得到的,以封闭在单引号用户输入任何东西,即使它不是一个字符串?像这样:
...
$Query = "INSERT INTO details (age) VALUES ('$Number')"; <-- quotes
...
如何执行SELECT
?是这样的:
$ID = mysqli_real_escape_string($dbc, $_POST["id"]);
$Query = "SELECT * FROM users WHERE id = $ID"; <-- no quotes
$Result = mysqli_query($dbc, $Query);
注:
$ID = mysqli_real_escape_string($dbc, $_POST["id"]);
$Query = "SELECT * FROM users WHERE id = '$ID'";
$Result = mysqli_query($dbc, $Query);
不比我知道准备的语句,通常使用它们在字符串连接,但是这是遗留代码我处理。我想尽可能保证它的安全。
对于intval引用+1:当您希望发布整数时,通过将其转换为intval来验证它实际上是一个整数。 – Jeff 2011-06-07 18:23:52
那么你会在SQL字符串中加上int引号吗? – 2011-06-07 20:24:42
对不起,如果我不清楚:数字应该被转换为数字(intval/floatval),并且_not_不使用引号,并且mysql_real_escape_string不起作用。然而,如果你不这样做,只是在所有事情上都使用'mysql_real_escape_string'(一些框架/库甚至做到这一点),你就必须在这些字符串周围使用引号(介意你,字符串,而不是数字)。我想不出一种方式,否则会导致有用的SQL注入,但它仍然可能导致无效的查询。 – Wrikken 2011-06-07 20:28:49