Мы обновляемся с php 5.3 до 5.4, который не имеет обратной совместимости для get_magic_quotes_gpc. Я понимаю, что код по-прежнему будет работать, вроде как, но просто каждый раз возвращайте ЛОЖЬ.
Тем не менее, я думаю, что пришло время вычеркнуть это из нашего кода.
Вот типичный пример:
$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 и тому подобное. Является ли мое решение разумным / приемлемым?
Заранее спасибо.
<<<< РЕДАКТИРОВАТЬ — ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ >>>>
Спасибо за ответы. На самом деле, мы сделали много преобразований в PDO около 18 месяцев назад (в основном из-за такого рода советов по stackoverflow 🙂
Итак, у меня может быть какой-то избыточный, бессмысленный код. Вот полная картина того, что происходит под кодом, который я разместил выше, который получает переменную из URL.
Вы увидите, что есть (get_magic_quuotes_gpc), который раньше был там, теперь закомментирован и заменен на (добавочные черты). Но эта переменная передается в запрос 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"];
Нет, это не разумно.
Проблема в том, что функция «магические кавычки» была плохой идеей, поэтому попытка ее тиражировать означает лишь то, что вы до сих пор полагались на неработающее решение, и ваше приложение, без сомнения, уязвимо для атак с использованием SQL-инъекций. ,
«Почему магические кавычки — неработающее решение?» — спросите вы. И ответ отчасти скрыт в самом вопросе — безопасность и ИТ в целом не являются и не могут быть магия. Всякий раз, когда вы видите решение, которое рекламирует себя или, по крайней мере, кажется, работает «волшебным» образом, знайте, что это плохо, и вы никогда не должны доверять ему.
Вместо этого вам нужны контекстно-зависимые решения, а в случае предотвращения SQL-инъекций — это параметризованные запросы. Вы должны прочитать это, чтобы узнать больше: Как я могу предотвратить SQL-инъекцию в PHP?
Я также призываю вас перейти прямо к PHP 5.6, в основном по двум причинам:
Обновление (чтобы ответить на расширенный вопрос):
Вы не только можете удалить addslashes()
логика, но ты ДОЛЖЕН сделать это — если вы оставите его, он добавит косые черты к некоторым из ваших входных данных, и эти косые черты будут часть самих данных.
Вместо этого вы хотите утверждать входные данные — прежде всего проверьте, что они в правильном формате. Например, если вы ожидаете числовой идентификатор — проверьте, если он содержит только цифры, прежде чем использовать его.
Также, $HTTP_GET_VARS
был устарел с PHP 4.1 и вы должны использовать $_GET
вместо.
Других решений пока нет …