升级PHP - 需要删除get_magic_quotes_gpc

时间:2015-08-05 18:48:03

标签: php mysql sql-injection addslashes

我们正在从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"];

1 个答案:

答案 0 :(得分:1)

不,这不合理。

问题是,“魔术引号”功能首先是一个坏主意,所以试图复制它只意味着你依赖破碎的解决方案直到现在,你的应用程序毫无疑问容易受到攻击SQL注入攻击。

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

您需要的是上下文感知解决方案,并且在防止SQL注入的情况下 - 这是参数化查询。您应该阅读此内容以了解更多信息:How can I prevent SQL-injection in PHP?

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

  • PHP 5.4将在一个月内达到其生命周期,仅此一项就可能带来安全风险。
  • 你没有理由不这样做。老实说,升级路径是轻而易举的,并且只有很少的向后兼容性问题,如果有的话。 PHP现在稳定得多,自5.3与5.4相比,几乎没有显着的变化。

更新(回答扩展问题):

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

此外,自PHP 4.1 以来,$HTTP_GET_VARS已被弃用,您应该使用$_GET