Wordpress і магічні цитати


12

Я писав декілька плагінів Wordpress, і у мене виникли проблеми з Wordpress, що ставлять магічні котирування на дані POST та GET.

Зокрема, функція "wp_magic_quotes" в \ wp-включає \ load.php, яка викликається (імовірно, на кожну відповідь) у wp-settings.php. Ця функція додає магічні лапки до даних, навіть якщо я вимикаю магічні лапки в налаштуваннях PHP.

/**
 * Add magic quotes to $_GET, $_POST, $_COOKIE, and $_SERVER.
 *
 * Also forces $_REQUEST to be $_GET + $_POST. If $_SERVER, $_COOKIE,
 * or $_ENV are needed, use those superglobals directly.
 *
 * @access private
 * @since 3.0.0
 */
function wp_magic_quotes() {
    // If already slashed, strip.
    if ( get_magic_quotes_gpc() ) {
        $_GET    = stripslashes_deep( $_GET    );
        $_POST   = stripslashes_deep( $_POST   );
        $_COOKIE = stripslashes_deep( $_COOKIE );
    }

    // Escape with wpdb.
    $_GET    = add_magic_quotes( $_GET    );
    $_POST   = add_magic_quotes( $_POST   );
    $_COOKIE = add_magic_quotes( $_COOKIE );
    $_SERVER = add_magic_quotes( $_SERVER );

    // Force REQUEST to be GET + POST.
    $_REQUEST = array_merge( $_GET, $_POST );
}

Чи безпечно я лише прокоментувати дзвінок wp_magic_quotes () у wp-settings.php? Тобто, чи це негативно вплине на звичайний код Wordpress та / або відкриє якийсь вектор експлуатації? Якщо так, чи є ще якийсь спосіб зробити це, крім зміни коду WP (тому мені не доведеться з цим боротися кожен раз, коли є оновлення)?


Хтось може мені сказати, де / коли wp_magic_quotes()виконується функція ? Не вдалося знайти виконання у wp-core.
Т.Тодуа


Ця проблема існує ще в 2019 році, більш ніж через 8 років (наприклад, з PHP 7.1.33 (2019-10-23) та WordPress 5.2.4 (2019-10-14)).
Пітер Мортенсен

Відповіді:


8

Простіше кажучи, WP перетворює невизначену ситуацію (магічні котирування можуть бути або не ввімкнені в налаштуваннях сервера) на детерміновані (магічні лапки завжди є, а конфігурація сервера не має значення).

Замість того, щоб возитися з цим для всіх ядер WP, набагато більше сенсу просто знімати косої риски коду на власних змінних, коли це потрібно.


7
Це божевільно, якщо я можу. Магічні котирування вважаються поганими будь-яким розумним кодером, і це дійсно безвідповідальний вибір Wordpress. Не те, що я здивований.
o0 '.

5
@Lohoris зауважимо, що WP існує не просто тут і зараз. Він існує протягом багатьох років. Якби магічні цитати були по суті поганою ідеєю, вони б не існували в першу чергу. Хоча часи змінюються, і легко кричати, наскільки це погана ідея зараз - зміна існуючої поведінки в кодовій базі має величезні наслідки щодо безпеки та зворотної сумісності.
Рарст

3

Поточна поведінка в WordPress - найкраща практика, заснована на сумісності всіх систем та конфігурацій PHP. WordPress завжди нормалізував $ _GET, $ _POST, $ _COOKIE та $ _SERVER, і слід очікувати, що це буде продовжуватись робити це.

Отже, для вилучення параметра POST або GET ми повинні написати:

$value = stripslashes_deep($_POST['name']); або

$value = stripslashes_deep($_GET['name']);


0

Я написав рішення для вирішення цих суперглобальних масивів у подібному питанні в Stack Overflow.

Він складається з написання одного єдиного «методу доступу» (get / set) для кожного надглобального, прозорого розрізання та зняття. Отже, ви використовуєте, наприклад:

echo _get('username');    // echo stripslashes_deep($_GET['username']);
_cookie('name', 'value'); // $_COOKIE['name'] = addslashes_deep('value');

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


-3

Нещодавно у мене була ця проблема, і я, нарешті, з’ясував її. Я в основному шукав майже кожен веб-сайт за допомогою магічних цитат на WordPress, і жоден з них не допоміг.

Ось як це виправити:

  1. Зайдіть у свій wp-settings.php

  2. Шукати wp_magic_quotes ();

  3. Просто прокоментуйте це, і це має працювати зараз

Це працює, тому що якщо ви подивитеся на цей код, ви побачите:

// Disable magic quotes at runtime. Magic quotes are added using wpdb later in //wp-settings.php.

@ini_set( 'magic_quotes_runtime', 0 );
@ini_set( 'magic_quotes_sybase',  0 );

Ці магічні котирування, які додаються пізніше при використанні wpdb, - це збентежує більшість людей, і це, звичайно, wp_magic_quotes (). Просто прокоментувавши це, заперечуйте, щоб магічні цитати не зіпсували вас.


6
Погана ідея: після наступного оновлення ця зміна втрачається.
фуксія

Хоча це погана ідея ™, це єдине рішення, яке я знайшов запускати WordPress та Magento одночасно, не даючи проблем Magento під час збереження вмісту.
forsvunnet

1
Це також погана ідея, оскільки багато плагінів написані неправильно і не виходять з SQL правильно, щоб ваш сайт став вразливим до атак ін'єкцій SQL. І будь-які плагіни, які роблять правильно, запускаючи stripslashes / stripslashes_deep на $ _GET / $ _ POST, пошкодять введення користувача, видаливши зворотні риси.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.