我的PHP SQL查询是否可以安全地避免SQL注入


Is my PHP SQL query safe from SQL injection?

我想知道我的查询是否可以安全地避免SQL注入。

以下是PHP代码

$orderid = mysql_real_escape_string($orderid);
mysql_query("SELECT * FROM orders WHERE id ='"".$orderid."'"");  

还有

如果最终用户可以将订单ID更改为他们想要的,那么在最坏的情况下,他们能做什么呢?

是的,您展示的示例是安全的,不受SQL注入的影响

$orderid中没有可能引入SQL注入的内容,假设您没有使用具有错误#8378的MySQL客户端的旧版本。如果您使用的是MySQL 4.1.20、5.0.22或5.1.11或更高版本,则可以。

您收到的评论是关于风格和最佳实践的。

  • 查询参数可以更容易地使用,因为您不必担心反斜杠引号和字符串串联等问题。但对于本例来说,查询参数本身并不更安全。转义和参数化都需要注意一致地使用它们。

  • PHP的mysql扩展现在已被正式弃用,并将在未来的PHP版本中删除。这与编写更安全的代码有关,因为mysql扩展不支持参数,而其他扩展mysqli和PDO支持参数。

    我们鼓励开发人员现在就开始使用mysqli或PDO扩展,这样当这种情况发生时,您就不会发现自己无法在不重写所有代码的情况下升级PHP版本。

    这可能会帮助您:http://phpmaster.com/migrate-from-the-mysql-extension-to-pdo/

  • 标准SQL使用单引号来分隔字符串和日期文字。MySQL也支持双引号,但这取决于SQL_MODE的设置。如果您希望代码更加稳定和标准,请对字符串/日期文本使用单引号。

    此外,这对您来说更容易,因为您不必在PHP双引号字符串中反斜杠单引号。

    mysql_query("SELECT * FROM orders WHERE id = '".$orderid."'");  
    
  • 如果您的id列是整数,那么将$orderid强制转换为整数也很简单,这也同样安全,并使您的代码更加干净和简单:

    $orderid = (int) $orderid;
    mysql_query("SELECT * FROM orders WHERE id = $orderid");