2

我们正在从 php 5.3 升级到 5.4,它不向后兼容 'get_magic_quotes_gpc'。我知道代码仍然可以工作,但每次都带回一个 FALSE。

但是,我认为是时候从我们的代码中清除它了。

这是一个典型的例子:

     $product_id = "0";
        if (isset($HTTP_GET_VARS["id"])) {
          $rid = (get_magic_quotes_gpc()) ? $HTTP_GET_VARS["id"] : addslashes($HTTP_GET_VARS["id"]);
        }

       //then $product_id gets used all over the place in many different queries

我一直在研究如何解决这个问题,这就是我想出的:

    $rid = "0";
    if (isset($HTTP_GET_VARS["id"])) {
    $rid = addslashes($HTTP_GET_VARS["id"]);
    }

我在这里有点过头了。我知道这一切都与 SQL 注入等有关。我的解决方案是合理/可接受的吗?

提前致谢。

<<<< 编辑 - 附加信息 >>>>

感谢您的回复。实际上,大约 18 个月前,我们进行了一系列转换为 PDO(主要是由于关于 stackoverflow 的这种类型的建议 :)

所以,我可能有一些多余的、毫无意义的代码。这是我在上面发布的从 URL 获取变量的代码下面发生的事情的全貌。

您会看到,曾经存在的 (get_magic_quuotes_gpc) 现在被注释掉并被 (addslashes) 取代。但是该变量被传递给 PDO 查询。

$product_id = "0";
if (isset($HTTP_GET_VARS["id"])) {
  //$product_id = (get_magic_quotes_gpc()) ? $HTTP_GET_VARS["id"] : addslashes($HTTP_GET_VARS["id"]);
  $product_id = addslashes($HTTP_GET_VARS["id"]);
}

// NEW QUERIES - BEG xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

try {  
    # MySQL with PDO_MYSQL  
    $pdo = new PDO("mysql:host=$hostname_db;dbname=$database_db", $username_db, $password_db);  
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

    // Query 1:  product details
    $stmt = $pdo->prepare('SELECT 
    [a bunch of stuff here, fields, joins, etc]
    WHERE product_id = ? ');  
    $stmt -> execute(array($rid));
    $row_count_resto_details = $stmt->rowCount();
    $row_resto_details = $stmt->fetch(PDO::FETCH_ASSOC);


}  
// Error message for pdo
catch(PDOException $e) {  
    echo $e->getMessage();  
}  


// END QUERY xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

我可以去掉前 4-5 行代码中的所有东西,然后让它变成这样:

$product_id = $HTTP_GET_VARS["id"];
4

1 回答 1

5

不,这不合理。

问题是,“魔术引号”功能一开始是个坏主意,因此尝试复制它仅意味着您到现在为止一直依赖于一个损坏的解决方案,并且您的应用程序无疑容易受到 SQL 注入攻击.

“为什么魔术引用是一个破碎的解决方案?”,你可能会问。答案有点隐藏在问题本身中 - 安全和 IT 通常不是也不能是魔法。每当您看到一个宣传自己或至少似乎以“神奇”方式工作的解决方案时,请知道它很糟糕,您永远不应该相信它。

相反,您需要的是上下文感知解决方案,并且在防止 SQL 注入的情况下 - 这是参数化查询。您应该阅读本文以了解更多信息:如何防止 PHP 中的 SQL 注入?

我还敦促您直接升级到 PHP 5.6,主要有两个原因:

  • PHP 5.4 将在一个月内结束生命周期,仅此一项就可能带来安全风险。
  • 你没有理由不这样做。老实说,升级路径轻而易举,并且几乎没有向后兼容性问题,如果有的话。PHP 现在更加稳定,自 5.3 与 5.4 以来几乎没有重大变化。

更新(回答扩展问题):

你不仅可以删除addslashes()逻辑,而且你必须这样做——如果你离开它,它会在你的一些输入数据中添加斜杠,这些斜杠将成为数据本身的一部分
相反,您要做的是验证输入数据 - 首先检查它的格式是否正确。例如,如果您希望使用数字 ID - 请在使用前检查它是否仅包含数字。

此外,自 PHP 4.1$HTTP_GET_VARS起已弃用,您应该$_GET改用它。

于 2015-08-05T19:14:01.097 回答