2

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

下面是PHP代码

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

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

4

1 回答 1

2

是的,您展示的示例可以避免 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");  
    
于 2013-08-03T16:33:53.653 回答