Почему WordPress до сих пор использует addlashes (), register_globals () и magic_quotes?

37

Чтобы получить больше опыта в Wordpress, я углубился в его базу кода, чтобы изучить его внутреннюю работу и рабочий процесс, и я был очень удивлен, когда увидел это:

  • Они реализуют register_globals (выдержка из wp-includes/class-wp.php):

     // The query_vars property will be extracted to the GLOBALS. So care should
     // be taken when naming global variables that might interfere with the
     // WordPress environment.
     function register_globals() {
        global $wp_query;
        // Extract updated query vars back into global namespace.
        foreach ( (array) $wp_query->query_vars as $key => $value) {
            $GLOBALS[$key] = $value;
        }
    
  • Они полагаются на магические кавычки (exrpt из wp-includes/functions.php. magic_quotes_gpc отключается при начальной загрузке перед вызовом этой функции):

    function add_magic_quotes( $array ) {
        foreach ( (array) $array as $k => $v ) {
        if ( is_array( $v ) ) {
            $array[$k] = add_magic_quotes( $v );
        } else {
                $array[$k] = addslashes( $v );
        }
    
  • Они полагаются на addlashes (но с 2.8.0 они ввели также mysql_real_escape_string, но функция _weak_escape(), которая использует addslashes(), все еще существует в классе wpdb)
    ОБНОВЛЕНИЕ: Я вижу, что они эмулируют подготовленные заявления с помощью sprintf() и настраиваемых держателей, поэтому запросы должны быть безопасными, я думаю. Тем не менее я озадачен тем, почему они не предоставляют по крайней мере mysqli, ведь обнаружение Mysql и PHP-версии происходит в начале последовательности загрузки.

Теперь, из ежегодного посещения SO, я многому научился, особенно, что вышеупомянутые три функции "устарели" и показывают проблемы безопасности, и многие из них смотрят в ужасе.

Но у WP должна быть причина для их использования. Я бы хотел узнать более опытных программистов, если есть проблемы с безопасностью, или иногда их использование слишком затуманено слухами и ложными убеждениями. Я знаю, что magic_quotes является наследием прошлого, и то же самое можно сказать о добавочных файлах (по крайней мере, когда они используются для баз данных), но при поиске в google перед тем, как спросить об этом, я нашел много сайтов, говорящих об использовании addlashes() над mysql_real_escape_string().

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

Я не ищу мнения (я прекрасно знаю, что они оффтопические здесь), и я не пишу о Wordpress, надеюсь, это ясно. Я просто хотел бы знать, почему многие программисты PHP считают эти функции "плохими", и все же мировой гигант, такой как Wordpress, который в 3-й версии теперь все еще использует их.

Это для совместимости с разными серверами и версиями php? (тем не менее, они проверяют очень графу).
Есть ли что-то, что я пропустил в отношении этих функций, насколько они важны в такой среде, как wordpress (или вообще)? Честно говоря, я смущен.

  • 0
    Это кажется ужасной идеей, но WordPress имеет огромную историю сохранения совместимости. Вы заметили, если они всегда называются? Или это может быть просто включено для тех, у кого старый плагин, тема или другой хак не обновляется?
  • 5
    Я думаю, что все это ужасно плохая практика и считаю, что они являются результатом лени или хуже. :)
Показать ещё 7 комментариев
Теги:
security
escaping
global-variables

8 ответов

32
Лучший ответ

Изображение 3432
(Wordpress Open Tickets со временем)

Не полагайтесь на кодовую базу Wordpress, чтобы делать предположения о хорошей практике или текущих стандартах в PHP-кодировании. Я говорю об этом как о ком-то, кто долгое время работал над развитием Wordpress.

Wordpress codebase составляет около 10 лет, он содержит устаревший код [1]. Из-за этого программа не может развиваться на кодовом уровне, поэтому вы обнаружите много обходных решений для проблем, которые уже решены в наши дни намного лучше.

Просто возьмите эту историю: у PHP были магические цитаты. Разработчики Wordpress считали это полезным. Поэтому для тех хостов, которые не настроили его, они добавили его. Завершение кода whith, который ожидает резкие входные данные часто и в разных местах. Простая вещь заключается в том, что теперь они просто не могут легко изменить ее на надлежащую обработку ввода и очистку из-за использования (супер) глобальных переменных, представляющих статическое глобальное состояние почти везде.

Вы не можете легко реорганизовать такой код.

То же самое для класса базы данных. Он имеет долгую историю, первоначально основанную на ранней версии ezSQL. В то время не было mysql_real_escape_string, и когда он был введен, у разработчиков WP возникла проблема с тем, что не все его поддерживающие базы поддерживают.

Так что не задумывайтесь о практике кодирования, которую вы найдете в коде Wordpress. Вы узнаете, как это могло быть сделано много лет назад и с более или менее устаревшими версиями PHP. Это не так давно, что Wordpress переключился на PHP 5, например.

  • Обратная совместимость.
  • Задайте большое количество (технически более или менее устаревших) хостов.
  • Не нарушайте работу с дефектами.

Возможно, это не ваш список приоритетов (надеюсь), проекты здесь сильно отличаются. Но наличие устаревшей кодовой базы является бременем, независимо от того, как устанавливаются приоритеты проекта. Wordpress - это только один пример.


[1] см. Вехи WordPress: ранняя временная шкала проекта (приблизительно 2000-2005 гг.))

  • 1
    Более 361 миллиона человек ежемесячно просматривают более 2,5 миллиардов страниц на сайтах WP, и во всем мире их используют более 71 миллиона. Итак, 1300 ошибок в отношении использования очень и очень низкий процент, так что на самом деле мой калькулятор начал получать научную информацию обо мне!
  • 4
    @ gus, если бы все эти 361 миллион человек были программистами, количество ошибок было бы астрономическим; на самом деле успех WP заключается в том, что вам просто нужно уметь читать и писать, чтобы использовать его; не полагайтесь на людей, использующих его, чтобы считать код оптимальным; В конце концов, сколько компьютеров работает на Windows?
Показать ещё 7 комментариев
12

В дополнение к ответу @tom.

Магические цитаты

Автоматический анализ всех записей и добавление магических кавычек - это создание ошибок и бесполезность.

  • Бесполезно, поскольку вы не можете полагаться на магические кавычки для защиты вашего ввода (примером может служить многобайтовая кодировка ошибок для SQL-инъекций). Поэтому перед сохранением данных в базе данных вам необходимо применить реальный фильтр.
  • Создание ошибок. Если вам нужно действительно избавиться от своих данных перед сохранением в базе данных, вам нужно проверить, что она еще не сбежала (и простой факт, что эти настройки существуют и могут быть применены в среде хостинга, заставит вас проверить этот параметр был установлен или нет).
  • Создание ошибок: все данные, отправленные пользователем, не всегда предназначены для хранения базы данных. Эвакуация может сломать контент, подумать о json-контенте, например, или даже содержимое файла с опасным magic_quote_runtime
  • Создание ошибок: все хранилище базы данных не экранируют кавычки одинаково...

Итак Почему?, почему мы видим такую ​​функцию в CMS?

  • см. здесь функцию add_magic_quotes, которая может использоваться в выделенном массиве, возможно, не на _GET или _POST. Но эффективно тот факт, что эта функция просто использует addlashes, а не функцию, предназначенную для базы данных, делает ее довольно плохим.
  • Тот факт, что хостинг-провайдер может применять автоматические магические кавычки, - это кошмар для разработчика CMS. Либо вы обнаружите это, либо сообщите пользователю, которого вы отказываетесь запускать, или вам нужно управлять тем фактом, что контент может или не может быть волшебным - добавлено... и чтобы все были в одном состоянии, вы запускаете не-добавленный контент в этой функции, чтобы по крайней мере все были в одном и том же (плохом) состоянии.
  • Из того, что я могу видеть в Wordpress, до сохранения a stripslahes_deep выполняется в wp_insert_post. И add_magic_quotes обычно выполняется на данных, выведенных из Db, прежде чем эти данные будут отправлены на wp_insert_post. Это может мне показаться, что проблема заключается в том, чтобы эффективно добавлять косые черты перед их удалением... возможно, потому что санируют фильтры, которые происходят до сохранения ожидаемого контента со слэшами, или, может быть, потому, что никто не помнит, почему код работает таким образом: -)

register_globals

Кажется, что это способ реализовать шаблон реестра в wordpress... Они хотели сделать код простым для понимания и позволить простой способ доступа к объектам-импортерам, таким как запрос или сообщение. И объектно-ориентированный класс реестра не был в простом PHP-способе, где массив $_GLOBALS уже является существующим реестром.

Наличие реестра - это совершенно правильная вещь в приложении. Функция register_global опасна, только если вы разрешите некоторому вводу пользователя переопределить действующий безопасный ввод. И, конечно, только если этот безопасный ввод взят из $_GLOBALS в другом месте (или с ключевым словом global).

Опасная часть функции здесь - часть функции, которую вы извлекли, цикл на $query->query_vars. Вам нужно будет отслеживать вызовы, чтобы увидеть, может ли пользователь вводить ключи через tt wp_parse_args и заканчивать эту функцию. Но следующей частью этой функции является фиксация содержимого $_GLOBALS для нескольких объектов:

$GLOBALS['query_string'] = $this->query_string;
$GLOBALS['posts'] = & $wp_query->posts;
$GLOBALS['post'] = (isset($wp_query->post)) ? $wp_query->post : null;
$GLOBALS['request'] = $wp_query->request;

Таким образом, по крайней мере тезисы глобалов не могут быть перезаписаны пользователем и безопасны.

Таким образом, функции тезисов плохие. Но вы можете использовать их, если понимаете, что они делают и что вам нужно делать, чтобы предотвратить плохие последствия. И когда вы хотите внедрить простую структуру для разработчиков, доступную в очень широких средах, вам иногда приходится их использовать.

Но, конечно же, это плохая практика, вы наверняка найдете плохие плагины WordPress с неправильным использованием $_GLOBALS или неправильное использование концепции add_magic_quotes to data pulled from db wordpress. Но уже задолго до того, как Zend Framework CMS получила такое большое количество вкладов.

11

Магические цитаты

Следующий текст взят из PHP.net

http://www.php.net/manual/en/security.magicquotes.why.php

Нет причин использовать магические кавычки, потому что они больше не являются поддерживаемой частью PHP. Тем не менее, они действительно существовали и помогали нескольким новичкам в блаженном и неосознанном виде писать лучше (более безопасный) код. Но, имея дело с кодом, который опирается на это поведение, лучше обновить код вместо того, чтобы включать магические кавычки. Так почему же эта функция существует? Простой, чтобы помочь предотвратить инъекцию SQL. Сегодня разработчики лучше осведомлены о безопасности и в конечном итоге используют механизмы экранирования, специфичные для базы данных, и/или подготовленные операторы вместо того, чтобы полагаться на такие функции, как магические кавычки.

addslashes() vs mysql_real_escape_string()

Причина, по которой вы должны использовать mysql_real_escape_string(), заключается в том, что она является "функцией MySQL" и создана специально для экранирования ввода пользователя перед ее выполнением в запросе mysql, тогда как addslashes() является "функцией PHP". Вероятно, это звучит немного странно, но существует одно важное различие между ними и оно связано с использованием однобайтовых и многобайтовых символов. Вы все же можете вводить базы данных, защищенные функцией addlashes, но вводить базы данных, защищенные mysql_real_escape_string, гораздо сложнее. Вы можете узнать больше об этом ЗДЕСЬ

Регистрировать глобалы

Причина, по которой вы НЕ должны использовать register_globals, состоит в том, что переменные становятся доступными для всех, а это означает, что в следующем примере вы могли бы установить $access для true, если он не был инициализирован до

<?php

if (isAuthenticated()) { $access = true; }

if ($access == true) {
  include(controlpanel.php);
}

?>

Вышеприведенный код даст вам sh #! множество проблем, но если мы сначала инициализируем переменную, добавив в верхнюю часть страницы

$access = false;

... мы должны быть в порядке, даже если у нас есть register_globals ON

Итак, если команда Wordpress инициализировала все переменные (что они, вероятно, есть), вам не нужно беспокоиться об использовании глобальных символов.

Заключение

Это определенно плохая практика, использующая любую из этих 3 функций/функций, и я бы никогда не сделал это сам. Вы уверены, что работаете с последней версией Wordpress? Как кто-то прокомментировал, если вы используете последнюю версию, это из-за лени или еще хуже, он все еще там. Я никогда не использовал Wordpress для чего-либо, кроме блогов, которые не требуют большой защиты.

  • 1
    Спасибо за информацию, хотя я знаю, что это за функции, и поэтому я спросил, почему они используются! Да, это последняя версия WP (3.3.1). Что касается проблемы, связанной только с mysql, то для них это не оправдание, они могли бы реализовать разные драйверы или, по крайней мере, предоставить набор функций mysqli для новостей mysql, но не отследить они ... все еще озадачены
  • 3
    @DamienPirsy - Да, понятия не имею, почему эти функции все еще там. Я бы не использовал Wordpress ни для чего другого, кроме блогов, которые не требуют особой безопасности.
Показать ещё 1 комментарий
7

Wordpress. Я провел много бессонных ночей, пытаясь ответить на единственный вопрос: "Почему?"

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

У него нет ядра. Вместо ядро ​​есть мусор кода. Это напоминает php3. В нем используется огромная куча несвязанных и нелегальных функций. "Копировать и вставить" - единственный шаблон дизайна используется в wordpress.

Да, они эмулируют использование подготовленных операторов. Но почему они не используют PDO или mysqli? Они копировали почти все функции PDO, но вместо этого не использовали его. Использование mysqli вместо mysql требует еще меньше усилий.

Они используют myql_real_escape_string. Но есть еще что-то вроде protect_string_strongly, protect_string_weakly. Существует не только одна функция - do_not_protect_string_i_believe_my_users.

Глобальные переменные - это философия Wordpress. "Если мы не знаем, как изменить этот var, мы будем отмечать его как глобальный var, и все будут счастливы". - вот что подумали разработчики Wordpress, когда они разработали hellpress.

Каждая новая версия содержит много нового в дизайне, они добавляют новые темы по умолчанию, они меняют цвет фона в области администратора С#ccc на #cdcdcd, они используют выпадающее меню в области администрирования вместо accordeon. И это потрясающе. Но они не улучшают его код.

Вы читали комментарии в WP "core"? Нет? И я сделал. Они замечательные ". Что-то вроде" Для чего нужна эта функция? Пусть на всякий случай уйдет ". или" Не печатайте это в новой версии". и т.д.

Единственный ответ на вопрос "Почему?" У меня есть: "Потому что это работает. И если это работает, не трогайте его!!!"

wordpress.org - один из самых посещаемых сайтов в мире. Зачем? Потому что никто не может понять логику Wordpress. Каждый раз каждый раз нужно что-то задавать на форуме или читать в кодексе.

Надеюсь, вы понимаете мою точку зрения.

3

Нет лучшего способа ответить, почему они плохи, чем ссылаться на документацию PHP на magic_quotes:

Также обратите внимание:

Эта функция была DEPRECATED с PHP 5.3.0. Опираясь на эту особенность, очень не рекомендуется.


Итак, почему Wordpress по-прежнему использует магические цитаты?

Минимальные требования Wordpress использует PHP 4.3. Да, это абсолютно обратная совместимость.

Как насчет других функций?

Я честно не уверен. Опираясь на супер-глобалы, это очень плохая идея. Это просто лень команды разработчиков Wordpress. Возможно, у них есть более важные проблемы для работы.

  • 0
    какой смысл использовать магические кавычки для совместимости?
  • 0
    @ Col.Shrapnel Потому что они включены по умолчанию в старых версиях. Я признаю, что они должны были отменить магические кавычки вместо того, чтобы применять их, но это было, вероятно, решение, принятое, когда PHP 4.3 был основной версией, и некоторые люди ее отключили. Имеет смысл.
Показать ещё 1 комментарий
1

Они сделали это по одной причине:

Чтобы убедиться, что Wordpress совместим с большинством поставщиков веб-хостинга.

  • 1
    Я так и думал, но поскольку они очень рано проверяют наличие версий php и mysql, это означает, что они могут обслуживать разный код для разных ситуаций (до php5 - после php 5), и это не приведет к значительному увеличению их кодовой базы.
0

Одно из главных отличий между mysql_real_escape_string() и добавками - то, что mysql_real_escape_string() работает в сочетании с набором символов, чтобы он знал, как правильно удалять данные на основе набора символов.

Как правило, я считаю, что лучший подход - использовать класс запроса и делать все, что у вас есть. Таким образом, существует только одно место, где вы имеете дело с GET, POST, COOKIE, SERVER и т.д., Что значительно упрощает управление, в отличие от того, что куча случайных функций выполняет разные вещи. Это просто рецепт катастрофы.

  • 0
    Хотите разместить ссылку на это интервью?
  • 0
    его на месте из памяти, что с голосования вниз. Я не говорю, что согласен.
Показать ещё 4 комментария
0

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

Очевидно, что вы не можете получить ответ здесь, если вы не соблазните некоторого авторизованного разработчика Wordpress здесь с такой щедростью.

Но ваш вопрос слишком широк. Однако на него можно ответить абстрактной частью:

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

Действительно ли мытье рук предотвращает болезнь?
Что, если я не буду мыть руки - неужели я буду болеть?

Большая часть времени - нет.
Как общая привычка - да.

Эти особенности (хотя, действительно, как и любая другая особенность нашего невезучего языка, слишком омраченная слухами) - это всего лишь гигиена, которую каждый должен соблюдать как основной инстинкт.

Хотя большую часть времени...

  • addslashes не принесет никакого вреда, пока ваша кодировка будет либо utf-8, либо однобайтовой;
  • Регистрировать глобальные переменные не повредит, если вы инициализируете все свои переменные;
  • магические кавычки не будут наносить никакого вреда, если у вас есть все ваши переменные, котируемые для SQL, и косые черты, снятые для любого другого использования;

... любое исключение из этих обстоятельств может сделать вас больным с большой вероятностью.

  • 0
    Что ж, если кто-то из разработчиков WordPress заманил бы меня, я был бы благодарен: «официальный» ответ побил бы идею и мнение любого «третьего лица», поэтому я не вижу в этом плохого аспекта. И спасибо (+1) за ваше последнее добавление, показывающее, что эти функции не могут (как правило, при правильном использовании) нанести вред, является большим шагом в лучшем понимании того, как они работают и как их можно использовать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню