Pergunta

Eu encontrei esta linha de código no plugin Virtuemart para Joomla na linha 2136 na administrator / components / com_virtuemart / aulas / ps_product.php

eval ("\$text_including_tax = \"$text_including_tax\";");
Foi útil?

Solução

Sucata minha resposta anterior.

A razão deste eval () está aqui é mostrada na php eval docs

Isto é o que está acontecendo:

$text_including_tax = '$tax <a href="...">...</a>';

...

$tax = 10;

...

eval ("\$text_including_tax = \"$text_including_tax\";");

No final deste $text_including_tax é igual a:

"10 <a href="...">...</a>"

As aspas simples impede $tax ser incluídos na definição original do string. Usando eval() que obriga a re-avaliar a corda e incluem o valor para $tax na string.

Eu não sou um fã deste método particular, mas é correto. Uma alternativa poderia ser a utilização sprintf()

Outras dicas

Este código parece ser uma má maneira de forçar $text_including_tax ser uma string.

A razão é ruim é porque se $text_including_tax pode conter dados inseridos por um usuário que é possível para eles para executar código arbitrário.

Por exemplo, se $text_include_tax foi definido para igual:

"\"; readfile('/etc/passwd'); $_dummy = \"";

O eval seria:

eval("$text_include_tax = \"\"; readfile('/etc/passwd'); $_dummy =\"\";");

Dar o usuário mal-intencionado um despejo do arquivo passwd.

Um método mais correto para fazer isso seria a de converter a variável para string:

$text_include_tax = (string) $text_include_tax;

ou mesmo apenas:

$text_include_tax = "$text_include_tax";

Se o $text_include_tax dados é apenas uma variável interna ou contém já validado conteúdo não é um risco de segurança. Mas ainda é uma má maneira de converter uma variável para uma string, porque há mais óbvia e maneiras mais seguras para fazê-lo.

Eu estou supondo que é uma maneira funky de forçar $ text_including_tax ser uma string e não um número.

Talvez seja uma tentativa de converter a variável como uma string? Apenas um palpite.

Você vai precisar do eval para obter a taxa de imposto na saída. Acabou de se mudar isso para um novo servidor e por algum motivo esta linha causou um erro no servidor. Como uma solução rápida, o texto foi alterado para:

//eval ("\$text_including_tax = \"$text_including_tax\";");
$text_including_tax = str_replace('$tax', $tax, $text_including_tax);

Ele está avaliando a string como código PHP.

Mas parece estar a fazer uma variável igual a si mesma? Estranho.

Como os outros têm para fora pontas, é um código escrito por alguém que não sabe o que diabos eles estão fazendo.

Eu também tive uma olhada rápida do código para encontrar uma total falta de texto escapar ao colocar HTML / URI / etc. juntos. Há provavelmente muitos furos de injecção que podem ser encontrados aqui, além das questões eval, se você pode ser incomodado para auditar-lo corretamente.

Eu não gostaria que este código em execução no meu servidor.

Eu olhei através dessa base de código antes. É uma das piores PHP eu já vi.

Eu imagino que você faria esse tipo de coisa para encobrir erros que você fez em outro lugar.

Não, ele está fazendo isso:

Say $text_including_tax = "flat". Este código avalia a linha:

$ plana = "flat";

Não é necessariamente bom, mas eu usar uma técnica como esta, uma vez que chupar todas as variáveis ??do MySQL em uma matriz como este:

    while ($row = mysql_fetch_assoc($result)) {
        $var = $row["Variable_name"];
        $$var = $row["Value"];
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top