正在升级 PHP - 需要删除 get_magic_quotes_gpc
Upgrading PHP - Need to remove get_magic_quotes_gpc
我们正在从 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 注入等有关。我的解决方案是 reasonable/acceptable 吗?
提前致谢。
<<<< 编辑 - 附加信息 >>>>
感谢您的回复。实际上,我们在大约 18 个月前进行了一系列到 PDO 的转换(主要是由于 Whosebug 上的此类建议 :)
所以,我可能有一些多余的、毫无意义的代码在运行。这是我在上面发布的代码下方发生的事情的全貌,它从 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 注入攻击。
"Why is magic quotes a broken solution?",您可能会问。答案有点隐藏在问题本身中——安全和 IT 通常不是也不可能 magic。每当您看到一个宣传自己或至少看起来以 "magic" 方式工作的解决方案时,请知道它是坏的,您永远不应该相信它。
您需要的是上下文感知解决方案,在防止 SQL 注入的情况下 - 这是参数化查询。您应该阅读此内容以了解更多信息:How can I prevent SQL-injection in PHP?
我还建议您直接升级到 PHP 5.6,主要有两个原因:
- PHP 5.4 将在一个月内达到其生命周期的终点,仅此一项就可能存在安全风险。
- 你没有理由不这样做。老实说,升级路径是轻而易举的,并且几乎没有向后兼容性问题,如果有的话。 PHP 现在更加稳定,自 5.3 与 5.4 以来几乎没有重大变化。
更新(回答扩展问题):
您不仅可以删除 addslashes()
逻辑,而且您 必须 这样做 - 如果您保留它,它会在您的一些输入数据中添加斜杠,并且这些斜杠将是 数据本身的一部分 。
您要做的是 验证 输入数据 - 首先检查它的格式是否正确。例如,如果您需要数字 ID - 请在使用前检查它是否仅包含数字。
此外,$HTTP_GET_VARS
自 PHP 4.1 以来已被弃用 ,您应该改用 $_GET
。
我们正在从 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 注入等有关。我的解决方案是 reasonable/acceptable 吗?
提前致谢。
<<<< 编辑 - 附加信息 >>>>
感谢您的回复。实际上,我们在大约 18 个月前进行了一系列到 PDO 的转换(主要是由于 Whosebug 上的此类建议 :)
所以,我可能有一些多余的、毫无意义的代码在运行。这是我在上面发布的代码下方发生的事情的全貌,它从 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 注入攻击。
"Why is magic quotes a broken solution?",您可能会问。答案有点隐藏在问题本身中——安全和 IT 通常不是也不可能 magic。每当您看到一个宣传自己或至少看起来以 "magic" 方式工作的解决方案时,请知道它是坏的,您永远不应该相信它。
您需要的是上下文感知解决方案,在防止 SQL 注入的情况下 - 这是参数化查询。您应该阅读此内容以了解更多信息:How can I prevent SQL-injection in PHP?
我还建议您直接升级到 PHP 5.6,主要有两个原因:
- PHP 5.4 将在一个月内达到其生命周期的终点,仅此一项就可能存在安全风险。
- 你没有理由不这样做。老实说,升级路径是轻而易举的,并且几乎没有向后兼容性问题,如果有的话。 PHP 现在更加稳定,自 5.3 与 5.4 以来几乎没有重大变化。
更新(回答扩展问题):
您不仅可以删除 addslashes()
逻辑,而且您 必须 这样做 - 如果您保留它,它会在您的一些输入数据中添加斜杠,并且这些斜杠将是 数据本身的一部分 。
您要做的是 验证 输入数据 - 首先检查它的格式是否正确。例如,如果您需要数字 ID - 请在使用前检查它是否仅包含数字。
此外,$HTTP_GET_VARS
自 PHP 4.1 以来已被弃用 ,您应该改用 $_GET
。