2009-06-17 42 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 2009-06-17 14:20:40

0

你總是可以做一個特殊的'回聲'功能你自己的包含過濾器。然後用您的自定義函數替換代碼中的所有回顯。

<?php 
function filtered_echo($data) { 
    // filter $data here 
    echo $data; 
} 
?> 
相關問題