Wordpress e citações mágicas

12

Eu tenho escrito alguns plugins do Wordpress e tenho tido algum problema com o Wordpress colocando aspas mágicas nos dados POST e GET.

Especificamente, a função "wp_magic_quotes" em \ wp-includes \ load.php, chamada (presumivelmente em todas as respostas) em wp-settings.php. Essa função adiciona aspas mágicas aos dados, mesmo que eu desative aspas mágicas nas configurações do 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 );
}

É seguro eu apenas comentar a chamada wp_magic_quotes () em wp-settings.php? Ou seja, isso afetará negativamente o código normal do Wordpress e / ou abrirá algum vetor de exploração? Se sim, existe alguma outra maneira de fazer isso além de modificar o código WP (para que eu não precise lidar com isso toda vez que houver uma atualização)?

Matthew Groves
fonte
Alguém pode me dizer onde / quando a função wp_magic_quotes()é executada? Não consegui encontrar a execução no wp-core.
22418 T T. Tuaua
Esse problema ainda existe em 2019, mais de 8 anos depois (por exemplo, com o PHP 7.1.33 (2019-10-23) e o WordPress 5.2.4 (2019-10-14)).
Peter Mortensen

Respostas:

8

Basta colocar o WP transforma a situação indeterminada (aspas mágicas pode ou não estar ativada na configuração do servidor) em determinada (aspas mágicas sempre estão presentes e a configuração do servidor não importa).

Em vez de mexer com isso em todo o núcleo do WP, faz muito mais sentido simplesmente remover barras no seu código em suas próprias variáveis, quando você precisar.

Rarst
fonte
7
Isso é insano, se eu puder. As aspas mágicas são consideradas ruins por qualquer codificador são, e essa é uma escolha realmente irresponsável do Wordpress. Não que eu esteja surpresa.
o0 '.
5
@ Lohoris note que o WP não existe apenas aqui e agora. Existe um período de muitos anos. Se as citações mágicas fossem inerentemente ruins, elas não existiriam em primeiro lugar. Enquanto os tempos mudam e é fácil gritar quão ruim é a ideia agora - a mudança do comportamento existente na base de código vem com implicações enormes de segurança e compatibilidade com versões anteriores.
Rarst
3

O comportamento atual no WordPress é uma prática recomendada com base na compatibilidade de todos os sistemas e configurações PHP. O WordPress sempre normalizou as barras $ _GET, $ _POST, $ _COOKIE e $ _SERVER para serem cortadas, e espera-se que continue assim.

Portanto, para extrair um parâmetro POST ou GET, precisamos escrever:

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

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

Eu escrevi uma solução para lidar com essas matrizes superglobais em uma pergunta semelhante no Stack Overflow.

Consiste em escrever um único "método de acesso" (obter / definir) para cada superglobal, cortando e removendo transparentemente. Então você usaria, por exemplo:

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

Dessa forma, você pode evitar mexer ainda mais com os superglobais e aproveitar uma solução que funcione "localmente" para o seu código, sem efeitos colaterais. Para mim, foi a solução definitiva.

André Chalella
fonte
-3

Recentemente, tive esse problema e finalmente descobri. Eu estava basicamente pesquisando quase todos os sites sobre citações mágicas no WordPress e nenhum deles ajudou.

Isto é como corrigi-lo:

  1. Vá para o seu wp-settings.php

  2. Procure por wp_magic_quotes ();

  3. Basta comentar e deve funcionar agora

Isso funciona porque se você olhar antes desse código, verá:

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

Que o Magic cita que é adicionado mais tarde usando o wpdb é o que está atrapalhando a maioria das pessoas, e é wp_magic_quotes (). Apenas comentar isso evita que as aspas mágicas estraguem você.

Joe
fonte
6
Má ideia: após a próxima atualização, essa alteração será perdida.
fuxia
Embora essa seja uma má idéia ™, é a única solução que eu encontrei para executar o WordPress e o Magento simultaneamente, sem causar problemas ao Magento ao salvar o conteúdo.
Forsvunnet
1
Essa também é uma péssima idéia, pois muitos plug-ins são mal gravados e não escapam do SQL corretamente, portanto seu site pode ficar vulnerável a ataques de injeção de SQL. E qualquer plug-in que faça a coisa correta executando stripslashes / stripslashes_deep no $ _GET / $ _ POST corromperá a entrada do usuário removendo barras invertidas.
tomdxw