55

PHPで、以前にエコーまたは印刷されたすべてのアイテムをクリア/削除する方法はありますか?

例えば:

<?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'

?>

私のスクリプトはinclude関数を使用しています。含まれているファイルは何もエコーしないようになっています。誰か(例=ハッカー)が試みた場合に備えて、削除する方法が必要です。

4

5 に答える 5

110
<?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'

?>

出力バッファリング機能

出力バッファリング関数は、文字列を返すためにのみ出力する関数を強制するハッカーでも役立ちます。

<?php
ob_start();
var_dump($myVar);
$data = ob_get_clean();
// do whatever with $data
?>
于 2009-06-29T12:18:34.063 に答える
4

@monoxideは正しいですが、同じことを行うためのより直感的な方法を見つける方がよいでしょう。例えば:

<?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;
?>

乾杯、

jrh

于 2009-06-29T12:21:43.667 に答える
1

理想的には、最終的に印刷したくないものを出力しないでください。フラストレーションを減らすために、ロジックをプレゼンテーションから分離してください。

そうは言っても、PHP内の出力バッファリングオプションを調べることができます。

于 2009-06-29T12:21:28.800 に答える
0

それがデバッグ出力であり、プログラムのステータス情報である場合、おそらくtrigger_errorが必要なものに近い可能性があります。たとえば、次のようになります。

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

スクリプトが本番環境にある場合、通常は無効になっているかログに記録されるため、エラーは表示されません。また、die()を使用するのではなく、E_USER_ERRORを使用してこの方法で致命的なエラーを実行することをお勧めします。

ob_start ();
require ($filename);
$html = ob_get_clean ();

上記にはファイルも含まれ、その内容が文字列として提供されます。

警告:バッファを破棄すると、スローされたエラーメッセージも破棄され、デバッグが(潜在的に)悪夢になります。

于 2009-06-29T12:33:04.267 に答える
-1

たとえば、ハッカーがPHPファイルにアクセスできる場合は、出力バッファーをクリアするステートメントを削除することもできます。

ユーザーにPHPスクリプトのアップロードを許可しているためにこれを行っている場合、これは非常に悪い考えです。

どちらの場合も、求めていることを実行するとセキュリティが0になります。

于 2009-06-29T12:55:44.347 に答える