Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
升级PHP-需要删除get_magic_quotes_gpc_Php_Mysql_Sql Injection_Addslashes - Fatal编程技术网

升级PHP-需要删除get_magic_quotes_gpc

升级PHP-需要删除get_magic_quotes_gpc,php,mysql,sql-injection,addslashes,Php,Mysql,Sql Injection,Addslashes,我们正在从PHP5.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"] : addslash

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

不,这不合理

问题是,“magic quotes”功能一开始是个坏主意,因此尝试复制它只意味着到目前为止您一直依赖于一个失败的解决方案,并且您的应用程序无疑容易受到SQL注入攻击

你可能会问:“为什么魔术引语是一个失败的解决方案?”。答案是隐藏在问题本身中的——安全性和它通常不是也不可能是魔法。无论何时,当你看到一个解决方案在宣传它自己,或者至少看起来是以一种“神奇”的方式工作时,要知道它是不好的,你永远不应该相信它

相反,您需要的是上下文感知解决方案,在防止SQL注入的情况下,这就是参数化查询。您应该阅读此内容以了解更多信息:

我还建议您直接升级到PHP5.6,主要原因有两个:

  • PHP5.4将在一个月内到期,仅此一项就可能带来安全风险
  • 你没有理由不这样做。老实说,升级路径是一件轻而易举的事,如果有向后兼容性方面的问题的话,也没有什么问题。PHP现在稳定多了,从5.3版到5.4版几乎没有什么重大变化
更新(回答扩展问题):

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


另外,自PHP4.1以来,
$HTTP\u GET\u VARS
已被弃用,您应该改用
$\u GET

不,不是。addslashes对于sql注入是完全无用的。不要试图在PHP中重新创建旧的/愚蠢的/低能的东西。出于某种原因删除了magic_引号。使用mysqli或PDO,使用准备好的语句和占位符,将您的代码更新到现代标准。使用PDO,您就不会有这个问题。与旧方法相比,使用它是更好的练习,而且在大多数情况下更快。谢谢你们的回答。我已经展示了我的一些附加代码,它实际上已经是一个PDO查询。你能看一下吗?我想我的问题有点变了。谢谢你回答我的问题。但是你能看看我编辑的帖子吗。事实证明,我们已经转换为PDO。所以,我试图弄清楚这个$HTTP_GET_VARS和magic/addslashes是否只是旧的遗留代码,以及我应该使用什么从URL获取变量?$id=$HTTP\u GET\u VARS足够了吗?