Pergunta

Eu estou trabalhando em um projeto PHP, e eu quero executar o código que de obtida a partir de um banco de dados MySQL. Não há nenhuma chance de código inseguro sendo injetado, então a única coisa que eu estou preocupado é performace. Devo usar eval () para que eu possa executar diretamente o código, ou analisá-lo para que call_user_func () executa-lo em vez disso?

Por exemplo, se o código Peguei era "myfunc (1,2,3); anotherFunc (3,2,1);"
Posso eval ()-lo diretamente para executar o código.

Mas para call_user_func (), eu teria que analisar a cadeia para que ele possa ser executado. Então, qual é a melhor função para uso neste caso?

Foi útil?

Solução

Como regra geral, eu sempre tentar ficar o mais longe eval () possível. Neste caso, no entanto, parece um bom candidato para o mesmo.

Você diz "Não há nenhuma chance de código inseguro sendo injetado" , então a grande questão é: existe uma chance de unworking código estar no banco de dados

?

Se não, eval () é a solução, mas se houver, em seguida, adequada análise e de erro de registro / etc pode ser uma aposta mais segura. (Eu acredito usando call_user_func_array () é mais rápido em teoria, portanto, qualquer sobrecarga de análise pode se tornar desprezível)

Outras dicas

Armazenamento PHP no banco de dados é um cheiro design ruim em si mesmo; embora, neste caso, você está bastante certo nunca pode conter código inseguro, é sempre bom para minimizar o número de suposições ou defesas como essa você tem que fazer. Se você armazenar o código PHP no banco de dados, em seguida, um ataque em que um atacante ganha acesso a seu banco de dados rapidamente se torna muito mais grave, se transformando em um ataque no qual um atacante pode executar código arbitrário! Eu sei que ter seu banco de dados comprometido como este é altamente improvável, mas mesmo assim é uma boa prática de segurança para não deixar mesmo uma situação de compromisso improvável seu sistema mais do que ele precisa.

Muitas pessoas concordam que eval () deve sempre, sem exceção, ser evitado em código PHP. Há sempre uma alternativa.

Neste caso, no entanto, eu acho que eu teria que dizer que o uso de eval () seria a melhor solução para você, porque você já está armazenando código PHP no DB, portanto, usando eval () não vai aumentar o risco mais longe do que isso.

Gostaria, no entanto, recomendamos que

  1. Você tenta validar o código antes de eval () que, por ser conservador no que você permitir. Suponha que de alguma forma um atacante entrou em seu banco de dados até pensou que é improvável.
  2. Você pelo menos, dar algum pensamento sério para reescrever o aplicativo para que o código PHP não é armazenado em um banco de dados. Se você estiver armazenando estruturas de dados complexas, pensar em algo como JSON ou mesmo XML em seu lugar. existem analisadores seguras para estes.

Me desculpe se esta resposta parece um reacionário bit; Eu só acontecerá a sentir esse tipo de coisa é muito importante.

Gostaria de pensar que a análise seria adicionar uma sobrecarga, mas a única maneira que você pode ter certeza que é para executar testes lo. Experimente ambas as maneiras com várias funções e ver o que seus resultados são. Use o código que representa o que você espera para armazenar.

Boa sorte!

Use eval (). Qualquer outra coisa que não vale a pena o esforço -. Eles não têm quaisquer efeitos secundários positivos

Você pode querer dar uma olhada na extensão runkit , que pode executar php em uma sandbox não efetuando o código de execução.

Se o código é suposto efeito o seu código em execução, ir para eval ().

Você deve quebrar o código que você está prestes a ser executado em um bloco try / catch também, no caso de haver um erro (mesmo que você disse que não haverá, há uma possibilidade, e é a melhor prática)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top