Как мне присоединить потоковый фильтр к эхо? - PullRequest
2 голосов
/ 17 июня 2009

Есть ли способ присоединить потоковый фильтр к эхо-сигналу, чтобы любые передаваемые данные проходили через потоковый фильтр? Моя идея - написать выходной экранирующий фильтр для защиты от 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>");

Ответы [ 2 ]

1 голос
/ 17 июня 2009

Вы можете использовать буферизацию вывода для любого задания фильтра.

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

Возможен любой более сложный пример.

0 голосов
/ 20 июня 2009

Вы всегда можете просто сделать свою собственную специальную функцию 'echo', которая содержит фильтр. Затем замените все эхо в вашем коде своей пользовательской функцией.

<?php
function filtered_echo($data) {
    // filter $data here
    echo $data;
}
?>
...