2009-06-17 3 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

필터를 포함하고있는 특별한 '반향'기능을 만들 수 있습니다. 그런 다음 코드의 모든 에코를 사용자 정의 함수로 바꿉니다.