Pergunta sobre echo, php, security – Como limpar itens previamente ecoados em PHP

41

Em php, existe alguma maneira de limpar / remover todos os itens previamente ecoados ou impressos?

Por exemplo:

<code><?php

echo 'a';
print 'b';

// some statement that removes all printed/echoed items

echo 'c';

// the final output should be equal to 'c', not 'abc'

?>
</code>

Meu script usa a função include. Os arquivos incluídos não devem ecoar nada. Apenas no caso de alguém (ex = hacker) tentar, eu preciso de uma maneira de remover.

Estou usando o oci_execute e, se a consulta falhar, ele exibirá a mensagem <b> warning </ b>. Mas eu estou lidando com o erro separadamente e não quero mensagem oracle. Portanto, esta questão é aplicável neste cenário também Adarsha
Se você está fazendo isso como uma "medida de segurança", provavelmente está fazendo errado. Você deve considerar uma abordagem diferente para o problema. Talvez crie outra pergunta informando qual é o seu problema? Carlos Lima

Sua resposta

5   a resposta
1

você não deve produzir nada que não queira imprimir. Mantenha sua lógica separada de sua apresentação para menos frustração.

Dito isto, você pode consultar oBuffer de saída opções dentro do PHP.

86
<code><?php

ob_start();
echo 'a';
print 'b';

// some statement that removes all printed/echoed items
ob_end_clean();

echo 'c';

// the final output is equal to 'c', not 'abc'

?>
</code>

Funções de buffer de saída

As funções de buffer de saída também são úteis no hackery para coagir funções que somente imprimem para retornar strings, ie.

<code><?php
ob_start();
var_dump($myVar);
$data = ob_get_clean();
// do whatever with $data
?>
</code>
@Matthew: ajudou muito! VKGS
Existem configurações do Apache para ativar / desativar o buffer de saída para várias páginas? Pacerier
Você também pode usar ob_end_flush () para imprimir as instruções que seguem ob_start (), em vez de descartá-las. Vejous3.php.net/ob_start Vern Jensen
-1

ele também poderá remover a instrução que limpa o buffer de saída.

Se você está fazendo isso porque está deixando seus usuários fazer upload de scripts PHP, deixe-me dizer que essa é uma ideia extremamente ruim.

Em ambos os casos, fazer o que você está pedindo adiciona 0 segurança.

Aqui está uma questão relacionada:stackoverflow.com/questions/1066930/… edt
@monóxido: Existem milhares de maneiras de mascarar inteligentemente essas ... Andrew Moore
Eu não posso armazenar valores pré-fabricados em um banco de dados porque o script é um plugin JQuery. Os usuários precisam ser capazes de inserir qualquer caminho relativo. Eu mudei a lógica do meu script para que o caminho deve ser relativo (não absoluto), a última parte do caminho deve conter "foo" e o nome do arquivo que está sendo incluído deve conter "foo". Isso funcionará? edt
@ed: são sempre maneiras de escapar das restrições de caminho. Não vejo como o jQuery está impedindo você de obter dados do banco de dados. É o PHP quem fará o trabalho, não o jQuery ... Tudo que você precisa fazer é apontar o jQuery para aquele arquivo PHP com uma string de consulta apropriada. E se o plugin é realmente codificado de tal forma que é impossível personalizá-lo, talvez você deva modificar o plugin. Andrew Moore
0

você está preocupado que talvez o trigger_error esteja mais próximo do que você precisa, como:

<code>trigger_error ("Attempting to load report #{$report_id}.", E_USER_NOTICE);
</code>

Quando seu script está em produção, ele não mostrará nenhum erro, já que geralmente eles são desabilitados ou registrados. Também é melhor fazer erros fatais com E_USER_ERROR, em vez de usar die ().

<code>ob_start ();
require ($filename);
$html = ob_get_clean ();
</code>

O acima também incluirá um arquivo e fornecerá seu conteúdo como uma string.

Advertência: A exclusão do buffer também eliminará quaisquer mensagens de erro, tornando a depuração (potencialmente) um pesadelo.

Ou, potencialmente, muito melhor se você usar o $ html obtido de get_clean () e colocá-lo no corpo da sua página, em vez de estragar os cabeçalhos e posicionar a maior parte da sua página. Matthew Scharley
4

é melhor encontrar maneiras mais intuitivas de fazer o mesmo. por exemplo.:

<code><?php
$val_to_print = $a;
if( $need_to_change==true ) 
    $val_to_print = $b;
// when you are sure you won't have to change again...
echo $val_to_print;
?>
</code>

Felicidades,

jrh

+1 para o problema de EOF. Esse problema demorou alguns dias para depurar. E foi apenas por acidente que eu encontrei. Steve Cooke
Ele está preocupado com alguém que está alterando arquivos que ele não controla, então, enquanto você está certo, você não está falando sobre o que ele está preocupado. Matthew Scharley
@monoxide Correndo o risco de ir completamente fora do tópico, você pode omitir a última tag de fechamento do PHP no final de um arquivo, o que é uma boa maneira de eliminar completamente o problema. Josh
Além disso, às vezes as pessoas ignoram o EOL no final dos arquivos de inclusão, causando um possível estrago se você precisar enviar um cabeçalho () mais tarde ... Matthew Scharley

Perguntas relacionadas