php - 我的 PHP SQL 查询是否安全,不会受到 SQL 注入(inject)的影响?

标签 php sql-injection

我想知道我的查询是否不会受到 SQL 注入(inject)的影响。

下面是 PHP 代码

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

还有

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

最佳答案

是的,您展示的示例不会受到 SQL 注入(inject)的影响。

$orderid 中没有任何内容可能引入 SQL 注入(inject),假设您没有使用具有 bug #8378 的古老版本的 MySQL 客户端。 。如果您使用的是 MySQL 4.1.20、5.0.22 或 5.1.11 或更高版本,那就没问题。

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

  • 查询参数可以更容易使用,因为您不必担心反斜杠引号和字符串连接等。但对于这个例子来说,查询参数本质上并不是更安全。转义和参数化都要求您注意一致地使用它们。

  • PHP 的 mysql 扩展现已正式弃用,并将在 PHP 的 future 版本中删除。这与编写更安全的代码有关,因为 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");  
    

关于php - 我的 PHP SQL 查询是否安全,不会受到 SQL 注入(inject)的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18034725/

相关文章:

javascript - WordPress的function.php wp_enqueue_script不工作

php - 如何防止 PHP 中的 SQL 注入(inject)?

sql - 如果使用 hibernate ,SQL 注入(inject)的安全性有多少

php - 如何防止 PHP 中的 SQL 注入(inject)?

php - 如何防止 PHP 中的 SQL 注入(inject)?

php - 使用 phpmyadmin 安装 LEMP

php - 使用 tomcat 运行 php 应用程序?

php - 如何提交字段名重复的表单数据?

PHP CLI : How to read a single character of input from the TTY (without waiting for the enter key)?

java - 验证jsp页面上的登录表单