Qual é o ponto de esta linha de código?
-
19-08-2019 - |
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\";");
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"];
}