2009-06-17 55 views
2

エコーされるデータがストリームフィルタを通過するようにエコーするストリームフィルタを接続する方法はありますか?私の考えは、XSSから保護するための出力エスケープフィルターを書くことです。ストリームフィルタをエコーする方法を教えてください。

このバグレポートhttp://bugs.php.net/bug.php?id=30583が見つかりましたが、2004年以降で、これが現在可能かどうかはわかりませんでした。

class strtoupper_filter extends php_user_filter 
{ 
    function filter($in, $out, &$consumed, $closing) 
    { 
    while ($bucket = stream_bucket_make_writeable($in)) { 
    $bucket->data = strtoupper($bucket->data); 
    $consumed += $bucket->datalen; 
    stream_bucket_append($out, $bucket); 
    } 
    return PSFS_PASS_ON; 
    } 
} 
stream_filter_register("strtoupper", "strtoupper_filter"); 

$fp = fopen("php://output", "w"); 
stream_filter_append($fp, "strtoupper"); 

echo "echo: testing 123<br>"; 
print("print: testing 123<br>"); 
fwrite($fp, "fwrite: testing 123<br>"); 

答えて

1

任意のフィルタジョブに対して出力バッファリングを使用できます。

<?php 
function my_filter($data) { 
    return strtoupper($data); 
} 
ob_start('my_filter', 4096); 
echo 'test'; 
ob_end_flush(); // Or end of script 

どのような複雑な例も可能です。

+0

すべてをフィルタリングする以外は良いアイデアです。私がPHPコードとHTMLを含むPHPスクリプトを持っていれば、PHPがフィルタを通過し、HTMLコードをフィルタリングしないようにするだけのものが必要です。 – ejunker

+0

HTMLと言ったらタグ以外のデータを意味しますか? preg_matchでフィルタをフィルタリングするだけではありません。 – eisberg

+1

PHP 5.4では、チャンクサイズ1が1になり、もはや4096と同じではなくなりました。 –

0

フィルタを含む独自の特別な「エコー」機能をいつでも作成できます。次に、コード内のすべてのエコーをカスタム関数に置き換えます。

<?php 
function filtered_echo($data) { 
    // filter $data here 
    echo $data; 
} 
?> 
関連する問題