Antidote para magic_quotes_gpc ()?

Eu vi dezenas de trechos do PHP que são assim:

function DB_Quote($string) { if (get_magic_quotes_gpc() == true) { $string = stripslashes($string); } return mysql_real_escape_string($string); } 

O que acontece se eu chamar DB_Quote("the (\\) character is cool"); ? (Obrigado jspcal!)

Não é suposto tirar barras apenas quando get_magic_quotes_gpc() == true e o valor é originado de $_GET , $_POST ou $_COOKIE superglobals?

Sim, eu também vi dezenas de fragments do PHP. Está um pouco triste.

As citações mágicas são uma questão de input. Deve ser consertado no estágio de input, iterando as matrizes GET / POST / COOKIES e removendo as barras, se você precisar que seu aplicativo seja executado em servidores usando o incorreto erro arcaico que é magic_quotes_gpc . A alternativa simples é detectar a opção de citações mágicas e morrer com um erro “seu servidor sugere” quando configurado.

mysql_real_escape_string é um problema de saída. Ele precisa ser executado no caminho do script, no encaminhamento do conteúdo para o database, se você não estiver usando consultas parametrizadas (o que você definitivamente deve considerar).

Estes são dois estágios distintos do programa não relacionados. Você não pode colocá-los na mesma function, embora seja tentador tentar encapsular todo o processamento de seqüências de caracteres em uma única checkbox.

Não é suposto tiramos barras apenas quando […] o valor foi originado de $ _GET, $ _POST ou $ _COOKIE superglobals?

Sim, exatamente. É por isso que o trecho que você citou é realmente prejudicial. Como o rastreamento da origem de uma string não é prático (especialmente porque você pode combinar strings de diferentes fonts, uma das quais é cortada e outra não), você não pode fazê-lo em uma única function. Deve ser duas funções separadas de tratamento de cordas chamadas no momento apropriado.

O primeiro passo é desligar completamente as citações mágicas e emitir grandes avisos unignoráveis ​​se estiver ativado.

Se esta não for uma opção para você, então, na minha opinião, o melhor caminho a seguir é remover todas as citações mágicas o tempo todo.

 // in an include used on every page load: if (get_magic_quotes_gpc()) { foreach (array('_GET', '_POST', '_COOKIE', '_REQUEST') as $src) { foreach ($$src as $key => $val) { $$src[$key] = stripslashes($val); } } } 

Um pequeno hit de desempenho, mas lhe dará muito mais facilidade de mente ao trabalhar com suas variables ​​a partir daí.

Sim, como disse David, até o script para usar apenas stripslashes na input de formulário …

Se você chamar stripslashes com a string “O’Reilly”, a string não será alterada. se você chamar stripslashes com uma string como: “o caractere da barra invertida (\) é legal”, o resultado irá replace a seqüência de escape \) com). então, usar essa function em todos os valores de db pode quebrar sutilmente as coisas, mas pode não ser notado.

Como muitos aplicativos, você também não pode suportar o modo de guias mágicas. Verifique-o e imprima um erro se estiver ligado. Está fora por padrão há anos e não é recomendado.

Você poderia tentar fazer o seguinte em $ _GET, $ _POST ou $ _COOKIE antes de fazer qualquer outra coisa com eles:

  

Observe que isso só funcionará se sua matriz de input for “plana” (não contém sub-arrays). Se você espera sub-arrays na input, então você precisará escrever seu próprio retorno de chamada para lidar com isso. Algo como

  $row) { $input [$key] = slashField ($row); } } else { $input = stripslashes ($input); } return ($input); } if (get_magic_quotes_gpc ()) { $_POST = array_map ('slashfield', $_POST); } ?> 

O número 6 é a idéia certa, mas não funciona, porque até o PHP 5.4 $$ src [$ key] usar a syntax da variável variável em $ src [$ key] que é interpretada como $ src [0], criando uma variável $ _ que é inútil. Basta usar & (o operador de referência) em $ val e $ val = stripslashes ($ val). Além disso, caso contrário, a partir de PHP 5.4, você provavelmente receberá um erro porque o PHP não apenas lançará o _ para 0

Intereting Posts