我的PHP SQL查询是否可以安全地从SQL注入?

时间:2013-08-03 16:07:39

标签: php sql-injection

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

以下是PHP代码

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

另外

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

1 个答案:

答案 0 :(得分:2)

是的,您显示的示例在SQL注入时是安全的。

$ orderid中没有可以引入SQL注入的内容,假设您没有使用具有bug #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");