使这个查询安全吗?
可能重复:
在PHP中停止SQL注入的最佳方法
我已经看到一些使用称为PDO的示例来使sql-infection或其他使用real_escape的查询变得安全,但它们似乎都不完整或假设一些知识。 所以我问,采取这个简单的更新查询,并从SQL注入安全。
function updateUserName($id,$first,$last)
{
$qry = 'UPDATE user SET first = "'.$first.'", last = "'.$last.'" WHERE id = '.$id;
mysql_query($qry) or die(mysql_error());
}
基本上,你必须:
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 occured”页面。
这是更好的查询:
$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
作为数字,以使它们更安全。
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);
我喜欢这样。
链接地址: http://www.djcxy.com/p/16745.html