Что не так с extract ()? - PullRequest
       29

Что не так с extract ()?

32 голосов
/ 06 мая 2009

Я недавно читал эту ветку о некоторых из худших практик PHP. Во втором ответе есть мини-дискуссия об использовании extract(), и я просто задаюсь вопросом, о чем весь гул.

Лично я использую его для разбиения заданного массива, такого как $_GET или $_POST, где я затем очищаю переменные позже, так как они были удобно названы для меня.

Это плохая практика? Какой здесь риск? Что вы думаете об использовании extract()?

Ответы [ 17 ]

1 голос
/ 10 ноября 2009

Как кто-то заметил в другом потоке, - это более безопасный способ использовать extract , позволяя ему извлекать только те переменные, которые вы укажете, вместо всего, что содержит массив.

Это служит двойной цели документирования, какие переменные выходят из него, поэтому отслеживание переменной не будет таким трудным.

1 голос
/ 02 июля 2015

Любое использование метода может привести к некоторым условиям, когда оно может стать точкой отказа для приложения. Я лично считаю, что extract () не следует использовать для ввода данных пользователем (это не предсказуемо) и для данных, которые не очищаются.

Даже в коде ядра CodeIgniter используется извлечение, поэтому использование метода не должно причинить вреда, если данные очищены и обработаны должным образом.

Я использовал извлечение в моделях CodeIgniter с переключателем EXTR_IF_EXISTS и ограничением количества переменных, это работает довольно хорошо.

1 голос
/ 06 мая 2009

Никогда не извлекайте ($ _ GET) в глобальной области видимости. Помимо этого, у него есть свои применения, например, вызов функции, которая (потенциально) может иметь множество необязательных аргументов.

Это должно выглядеть смутно знакомым для разработчиков WordPress:

function widget (Array $args = NULL)
{
    extract($args);

    if($before_widget) echo $before_widget;

    // do the widget stuff

    if($after_widget) echo $after_widget;
}

widget(array(
    'before_widget' => '<div class="widget">',
    'after_widget' => '</div>'
));
1 голос
/ 06 мая 2009

Риск такой же, как с register_globals. Вы позволяете атакующему устанавливать переменные в вашем скрипте, просто изменяя запрос.

0 голосов
/ 03 мая 2017

Помните, что extract() небезопасно, если вы работаете с пользовательскими данными (например, результатами запросов), поэтому лучше использовать эту функцию с флагами EXTR_IF_EXISTS и EXTR_PREFIX_ALL.

Если вы используете это правильно, то безопасно использовать

0 голосов
/ 12 декабря 2018

Чтобы немного пояснить предыдущие ответы ... Нет ничего плохого в extract (), если вы правильно фильтруете входные данные (как уже говорили другие); в противном случае вы можете столкнуться с огромными проблемами безопасности, такими как:

<?php

// http://foobar.doo?isLoggedIn=1

$isLoggedIn = (new AdminLogin())->isLoggedIn(); // Let's assume this returns FALSE

extract($_GET);

if ($isLoggedIn) {
    echo "Okay, Houston, we've had a problem here.";
} else {
    echo "This is Houston. Say again, please.";
}
0 голосов
/ 29 января 2015

Еще одна веская причина для того, чтобы больше не использовать extract (), заключается в том, что в PHP есть импульс для использования HHVM , который утверждает, что PHP примерно в 10 раз быстрее. Facebook (который сделал это) использует это, Wikipedia на этом, и по слухам WordPress, чтобы смотреть на это.

HHVM не позволяет извлекать ()

Это все еще своего рода альфа, так что это не самая большая проблема

...