• 设为首页
  • 点击收藏
  • 手机APP
    手机扫一扫下载
    华域联盟APP
  • 关注官方公众号
    微信扫一扫关注
    华域联盟公众号
hot天融信关于ThinkPHP5.1框架分离RCE漏洞的深

[/backcolor] 0x00 前言在前几个月,Thinkphp连续迸发了多个严重漏洞。由于框架应用的普遍性,漏洞影响十分 详情

PHP下对缓冲区的控制

[复制链接]
sterben 发表于 2016-10-13 20:41:34 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
PHP4.0 提供了一个输出缓冲函数汇合。输出缓冲支持允许你写包裹函数功用紧缩缓冲区。在 PHP4 的输出缓冲支持允许 HTML 头信息寄存, 无论 HTML的正文能否输出。但在PHP中,头信息( (header(), content type, and cookies )不采用缓冲 。 0 c* \$ o( h/ ]3 C* R

) B3 K. `. @: ]2 S* z) t在运用PHP的过程中难免要运用到header和setcookie两个函数,这两个函数会发送一段文件头信息给阅读器,但是假如在运用这两个函数之前曾经有了任何输出(包括空输出,比如空格,回车和换行)就会提示出错,提示信息如下:“Header had all ready send by”!。在PHP 4.0里面参与了缓冲区控制的几个函数,运用这些函数能够帮我们处置很多问题。 7 B1 F* d: ?) h$ t
  ! f# c- F: ]7 b% I" ~; r6 F
/ I) q1 X" }; z- l4 ?0 L
函数称号 函数格式 功用 阐明 . y! K6 ^0 Y2 K3 k' |3 r. H& d
Flush flush() 输出缓冲区内的内容并且删除缓冲区。 这个函数经常运用,效率很高。 . D4 F/ O3 K' U
ob_start void ob_start(void) 翻开输出缓冲区。 当缓冲区激活时,一切来自PHP程序的非文件头信息均不会发送,而是保管在内部缓冲区。为了输出缓冲区的内容,能够运用ob_end_flush()或者运用ob_end_clean()来输出缓冲区的内容。 0 v# Y# Z* X3 v, L
ob_get_contents string ob_get_contents(void) 返回内部缓冲区的内容。 这个函数会返回当前缓冲区中的内容,假如输出缓冲区没有激活,则返回 FALSE 。 2 X! j9 T  S) }
ob_get_length int ob_get_length(void) 返回内部缓冲区的长度。 这个函数会返回当前缓冲区中的长度;和ob_get_contents一样,假如输出缓冲区没有激活。则返回 FALSE。 : t) q: r# @( n- Q" t
ob_end_flush void ob_end_flush(void) 发送内部缓冲区的内容到阅读器,并且关闭输出缓冲区。 这个函数发送输出缓冲区的内容(假如有的话)。
& _, K5 c( x; t0 Y5 yob_end_clean void ob_end_clean(void) 删除内部缓冲区的内容,并且关闭内部缓冲区。 这个函数不会输出内部缓冲区的内容!
& s4 q+ |8 i; J3 d6 [+ Y# Rob_implicit_flush void ob_implicit_flush ([int flag]) 翻开或关闭绝对刷新 运用过Perl的人都知道$|=x的意义,这个字符串能够翻开/关闭缓冲区,而ob_implicit_flush函数也和那个一样,默许为关闭缓冲区,翻开绝对输出。
' ^- X$ i1 h& ~) o1 S7 P& O/ e: |( Z/ Y$ ^) ^) Z( P# m
二、实例剖析: % k- [' b' G$ b
% s* y- m2 y8 R: c  }# c1 a- S
1、用缓冲区控制的函数避免文件头发送信息出错。
) b9 V# z! Q2 D4 B2 V7 |3 i; Q' s8 R/ G* F
<? //PHP提示符 6 {' O& {) n& N9 t6 Y* Z4 b& A% O
ob_start(); //翻开缓冲区 + E, k  R* e& Z8 g4 I0 t
echo "Welcome /n"; //输出
" n; d+ u5 e' j9 k" r0 y! jheader("location:next.php"); //把阅读注重定向到next.php
. a- M! n; M  v?> + r# T6 e- y- s5 |! ~
. J! l+ ?4 [9 j1 d0 z: z  A! ^
假如去掉ob_start,PHP就会提示在文件的第4行出错,出错信息为“Header had all ready send by”,但是加上ob_start,就不会提示出错,缘由是当翻开了缓冲区,echo后面的字符不会输出到阅读器,而是保管在效劳器的缓冲区中,直到你运用flush或者ob_end_flush才会输出,所以并不会呈现文件头已输出的错误!
8 O5 n% r3 ?9 ~. i
( X' k- I5 F% o, ]* u" T2、保管输出(这是一个很经典的用处)。 + q! i% c/ _; f; A: n

  u# J# k: R; p4 O/ a假定你想知道客户端的屏幕输出信息像函数的输出结果等,而且这个输出信息会因客户端的不同而不同。我们能够用函数 <? phpinfo(); ?> 得到效劳器的设置信息,但是假如想要保管phpinfo()函数的输出怎样办呢?在没有缓冲区控制之前,能够说一点办法也没有,但是有了缓冲区的控制,我们能够轻松的处置。
0 j8 k, K4 }) F# o& {- y/ j, d2 G1 d( @- l
<?
3 {3 ?5 l6 X) ]. E9 i8 Q9 p) |ob_start(); //翻开缓冲区 $ W0 |' d) u! m3 L. r$ x
phpinfo(); //运用phpinfo函数 % W3 @  |7 H' r7 p- D) {0 Q
$info=ob_get_contents(); //得到缓冲区的内容并且赋值给$info 6 w$ ~; F1 ^! r6 a
$file=fopen('phpinfo.txt','w'); //翻开文件phpinfo.txt 8 A3 x! J+ G$ l" g! M5 g* m0 G1 P- r9 ?
fwrite($file,$info); //写入信息到phpinfo.txt
$ g, G6 i8 z- i) u5 @! {2 g' K2 o$ qfclose($file); //关闭文件phpinfo.txt
  o$ [6 Y1 q' P2 E- N7 Q* w?>
, R' w7 Y# d8 q& h8 t" Q7 |/ k% J, o7 n; Y/ S6 D5 l% g! ^8 B
用以上的办法,就能够把不同用户的phpinfo信息保管下来,这在以前恐怕没有办法办到!同样,用缓冲区的办法能够保管普通办法难以完成的任务,这其实上就是将一些“过程”转化为“函数”的办法。. J8 X1 l( Q0 ]& q4 z
You look down on me today, tomorrow I can't let you have been

关注0

粉丝6

帖子3328

发布主题
阅读排行 更多
广告位

扫描微信二维码

关注华域联盟公众号

随时了解更新最新资讯

admin@cnhackhy.com

在线客服(服务时间 9:00~18:00)

在线QQ客服

Powered by cnhackhy! © 2015-2019