mysql — обновление необходимо удалить get_magic_quotes_gpc

Мы обновляемся с 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"];

1

Решение

Нет, это не разумно.

Проблема в том, что функция «магические кавычки» была плохой идеей, поэтому попытка ее тиражировать означает лишь то, что вы до сих пор полагались на неработающее решение, и ваше приложение, без сомнения, уязвимо для атак с использованием SQL-инъекций. ,

«Почему магические кавычки — неработающее решение?» — спросите вы. И ответ отчасти скрыт в самом вопросе — безопасность и ИТ в целом не являются и не могут быть магия. Всякий раз, когда вы видите решение, которое рекламирует себя или, по крайней мере, кажется, работает «волшебным» образом, знайте, что это плохо, и вы никогда не должны доверять ему.

Вместо этого вам нужны контекстно-зависимые решения, а в случае предотвращения SQL-инъекций — это параметризованные запросы. Вы должны прочитать это, чтобы узнать больше: Как я могу предотвратить SQL-инъекцию в PHP?

Я также призываю вас перейти прямо к PHP 5.6, в основном по двум причинам:

  • PHP 5.4 достигнет конца своей жизни через месяц, и это само по себе делает возможной угрозу безопасности.
  • У вас нет причин не делать этого. Честно говоря, путь обновления является легким и идет с очень небольшими проблемами обратной совместимости, если таковые вообще имеются. PHP теперь намного стабильнее, существенных изменений с 5,3 против 5,4 очень мало.

Обновление (чтобы ответить на расширенный вопрос):

Вы не только можете удалить addslashes() логика, но ты ДОЛЖЕН сделать это — если вы оставите его, он добавит косые черты к некоторым из ваших входных данных, и эти косые черты будут часть самих данных.
Вместо этого вы хотите утверждать входные данные — прежде всего проверьте, что они в правильном формате. Например, если вы ожидаете числовой идентификатор — проверьте, если он содержит только цифры, прежде чем использовать его.

Также, $HTTP_GET_VARS был устарел с PHP 4.1 и вы должны использовать $_GET вместо.

1

Другие решения

Других решений пока нет …