我们正在从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"];
答案 0 :(得分:1)
不,这不合理。
问题是,“魔术引号”功能首先是一个坏主意,所以试图复制它只意味着你依赖破碎的解决方案直到现在,你的应用程序毫无疑问容易受到攻击SQL注入攻击。
“为什么魔术会引用一个破碎的解决方案?”,你可能会问。答案本身隐藏在问题本身 - 安全和IT通常不是也不可能是魔法。每当你看到一个自我宣传的解决方案,或者至少似乎以“神奇”的方式工作时,要知道它是坏的,你永远不应该相信它。
您需要的是上下文感知解决方案,并且在防止SQL注入的情况下 - 这是参数化查询。您应该阅读此内容以了解更多信息:How can I prevent SQL-injection in PHP?
我还建议您直接升级到PHP 5.6,主要有两个原因:
更新(回答扩展问题):
您不仅可以删除addslashes()
逻辑,而且必须这样做 - 如果您离开它,它会为您的某些输入数据添加斜杠,这些斜杠将< em>数据本身的一部分
您要做的是验证输入数据 - 首先检查它是否采用正确的格式。例如,如果您需要数字ID - 请在使用之前检查它是否只包含数字。
此外,自PHP 4.1 以来,$HTTP_GET_VARS
已被弃用,您应该使用$_GET
。