这个查询安全吗?

时间:2010-02-25 18:36:38

标签: php security sql-injection

  

可能重复:
  Best way to stop SQL Injection in PHP

我已经看到一些使用称为PDO的东西来使sql-infection或其他使用real_escape的查询安全的例子,但它们似乎都是不完整的或承担一些知识。所以我要问一下,采用这个简单的更新查询,并使其免于sql-injection。

function updateUserName($id,$first,$last)
{
    $qry = 'UPDATE user SET first = "'.$first.'", last = "'.$last.'" WHERE id = '.$id;
    mysql_query($qry) or die(mysql_error());
}

4 个答案:

答案 0 :(得分:8)

基本上,你必须:

在具体情况下,会给出类似的结果:

$qry = 'UPDATE user SET first = "'
    . mysql_real_escape_string($first)
    . ' ", last = "'
    . mysql_real_escape_string($last)
    . '" WHERE id = '
    . intval($id);

当然,这是考虑lastfirst是varchar,而id是整数。


作为旁注:当出现SQL错误(对于任何类型的错误也是如此)时,您不应该显示技术错误消息并让脚本死掉。

您的用户不会理解该技术错误消息 - 他们不知道如何处理它,这不是他们的问题。

相反,您应该记录(例如文件)该技术错误消息,供您自己使用;并向用户显示一个不错的“oops an error occurred”页面。

答案 1 :(得分:3)

这是更好的查询:

$qry = 'UPDATE user SET first = "'.mysql_real_escape_string($first).'", last = "'.mysql_real_escape_string($last).'" WHERE id = '.intval($id);

使用mysql_real_escape_string表示字符串,intval表示查询中的数字,以使其更安全。

答案 2 :(得分:3)

mysql_real_escape_string + sprintf

$qry = sprintf('UPDATE user SET first = '%s', last = '%s' WHERE id = %d', mysql_real_escape_string($first), mysql_real_escape_string($last), $id);

我喜欢这样。

答案 3 :(得分:1)

您可以将所有变量包装在mysql_real_escape_string()中。 PDO(PHP数据对象)是一个更好的解决方案,如果它在您的环境中可用。您可以找到这些文档here

PDO将使您的代码更加面向对象,并为您自动完成其中一些任务。可以在文档here中更深入地找到PDO准备语句的一些好的示例代码。