我已经看到一些使用称为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());
}
答案 0 :(得分:8)
基本上,你必须:
mysql_real_escape_string
intval
。在具体情况下,会给出类似的结果:
$qry = 'UPDATE user SET first = "'
. mysql_real_escape_string($first)
. ' ", last = "'
. mysql_real_escape_string($last)
. '" WHERE id = '
. intval($id);
当然,这是考虑last
和first
是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准备语句的一些好的示例代码。