Wordpress i magiczne cytaty

12

Piszę kilka wtyczek Wordpress i mam problem z Wordpressem umieszczającym magiczne cytaty na danych POST i GET.

W szczególności funkcja „wp_magic_quotes” w \ wp-obejmuje \ load.php, która jest wywoływana (przypuszczalnie przy każdej odpowiedzi) w wp-settings.php. Ta funkcja dodaje magiczne cytaty do danych, nawet jeśli wyłączę magiczne cytaty w ustawieniach 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 );
}

Czy mogę bezpiecznie komentować wywołanie wp_magic_quotes () w wp-settings.php? Czy to wpłynie negatywnie na normalny kod Wordpress i / lub otworzy jakiś wektor wykorzystania? Jeśli tak, to czy istnieje inny sposób na zrobienie tego poza modyfikacją kodu WP (więc nie muszę sobie z tym radzić za każdym razem, gdy pojawia się aktualizacja)?

Matthew Groves
źródło
Czy ktoś może mi powiedzieć, gdzie / kiedy funkcja wp_magic_quotes()jest wykonywana? Nie mogłem znaleźć wykonania w wp-core.
T.Todua
Ten problem nadal występuje w 2019 r., Ponad 8 lat później (np. W PHP 7.1.33 (2019-10-23) i WordPress 5.2.4 (2019-10-14)).
Peter Mortensen,

Odpowiedzi:

8

Mówiąc wprost, WP zamienia nieokreśloną sytuację (magiczne cytaty mogą lub nie mogą być włączone w konfiguracji serwera) na określone (magiczne cytaty są zawsze obecne, a konfiguracja serwera nie ma znaczenia).

Zamiast zadzierać z tym wszystkim rdzeniem WP, sensowniejsze jest po prostu usuwanie ukośników w kodzie na własnych zmiennych, kiedy jest to potrzebne.

Rarst
źródło
7
To szalone, jeśli mogę. Magiczne cytaty są uważane za złe przez każdego rozsądnego programistę, a Wordpress to naprawdę nieodpowiedzialny wybór. Nie to, że jestem zaskoczony.
o0 ”.
5
@Lohoris zauważa, że ​​WP nie istnieje tylko tu i teraz. Istnieje przez wiele lat. Gdyby magiczne cytaty były z natury złym pomysłem, nie byłyby na pierwszym miejscu. Chociaż czasy się zmieniają i łatwo jest wykrzyczeć, jak złym jest to teraz - zmiana istniejącego zachowania w bazie kodu ma ogromne konsekwencje dla bezpieczeństwa i kompatybilności wstecznej.
Rarst
3

Obecne zachowanie w WordPress jest najlepszą praktyką opartą na kompatybilności wszystkich systemów i konfiguracji PHP. WordPress zawsze znormalizował $ _GET, $ _POST, $ _COOKIE i $ _SERVER, aby je ciąć, i spodziewaj się, że będzie to kontynuował.

Aby wyodrębnić parametr POST lub GET, musimy napisać:

$value = stripslashes_deep($_POST['name']); lub

$value = stripslashes_deep($_GET['name']);
two7s_clash
źródło
0

Rozwiązanie problemu z tymi superglobalnymi tablicami napisałem w podobnym pytaniu w przepełnieniu stosu.

Polega na napisaniu jednej „metody akcesorium” (get / set) dla każdego superglobala, cięciu i usuwaniu w sposób przezroczysty. Więc użyjesz na przykład:

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

W ten sposób możesz powstrzymać się od bałaganu z superglobalami i cieszyć się rozwiązaniem, które będzie działać „lokalnie” dla twojego kodu, bez żadnych skutków ubocznych. Dla mnie było to najlepsze rozwiązanie.

André Chalella
źródło
-3

Ostatnio miałem ten problem i w końcu go rozgryzłem. Zasadniczo przeszukiwałem prawie każdą stronę internetową pod kątem magicznych cytatów na WordPressie i żadna z nich nie pomogła.

Oto jak to naprawić:

  1. Przejdź do swojego wp-settings.php

  2. Szukaj wp_magic_quotes ();

  3. Po prostu skomentuj to i powinno działać teraz

Działa to, ponieważ jeśli spojrzysz przed tym kodem, zobaczysz:

// 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 );

To, że Magic cytaty dodane później przy użyciu wpdb jest tym, co psuje większość ludzi, i zdarza się, że jest to wp_magic_quotes (). Komentowanie tego sprawi, że magiczne cytaty nie zepsują cię.

Joe
źródło
6
Zły pomysł: po następnym uaktualnieniu ta zmiana zostanie utracona.
fuxia
Chociaż jest to zły pomysł ™, jest to jedyne rozwiązanie, które znalazłem, aby jednocześnie uruchamiać WordPress i Magento bez problemów z Magento podczas zapisywania zawartości.
forsvunnet
1
Jest to również zły pomysł, ponieważ wiele wtyczek jest źle napisanych i nie może poprawnie uciec przed SQL, więc Twoja witryna może być podatna na ataki typu SQL injection. A wszelkie wtyczki działające poprawnie, uruchamiając stripslashes / stripslashes_deep na $ _GET / $ _ POST uszkodzą dane wprowadzone przez użytkownika, usuwając odwrotne ukośniki.