使这个查询安全吗?

可能重复:
在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);
    

    当然,这是考虑到lastfirst是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

    上一篇: Make this query safe?

    下一篇: MySQL Injection by LIKE operator