【问题标题】:How do I attach a stream filter to echo?如何将流过滤器附加到回显?
【发布时间】:2009-06-17 13:35:31
【问题描述】:

有没有办法将流过滤器附加到回显,以便回显的任何数据都通过流过滤器?我的想法是编写一个输出转义过滤器来防止 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>");

【问题讨论】:

    标签: php filter stream xss


    【解决方案1】:

    您可以将输出缓冲用于任何过滤作业。

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

    任何更复杂的例子都是可能的。

    【讨论】:

    • 好主意,但会过滤所有内容。如果我有一个包含 PHP 代码和 HTML 的 PHP 脚本,我只希望 PHP 输出的内容通过过滤器,而不是过滤 HTML 代码。
    • 当您说 HTML 时,您是指任何 标记之外的数据吗?如果不只是过滤您的过滤器;) 使用 preg_match。
    • 在 PHP 5.4 中,块大小为 1 现在为 1,不再与 4096 相同。
    【解决方案2】:

    您总是可以自己制作一个包含过滤器的特殊“回声”功能。然后用您的自定义函数替换代码中的所有回声。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多