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

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

为加速 PHP 程序而努力

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

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

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

x
动态网站的内容加速显示十分重要,本文通过对 PHP 几个函数的深入讨论,提出了 PHP 网页压缩和缓冲的解决方案 8 f+ u7 C* m- R! ?

& F6 _( r4 ^: D6 S
1 o" P: {& R$ f1 j
一、介绍几个控制 PHP 输出的函数 + k3 ~  w/ Q% H! x: E7 J$ R
9 l/ L  Q# ?! l4 b0 }( _9 f
+ X4 J8 H/ R2 Z7 Q' P, F% N, O7 p
PHP4 采用了缓冲机制,在你决定发送以前,所有内容只是存在于缓冲中,而不是直接发送给浏览器,虽然你可以用 header 和 setcookie 函数来实现,但是这两个函数相比于功能强大的输出函数来说只是一点“雕虫小技”。让我们来看看这些函数的真本事: " M+ W# h3 x; B, s6 Y* R: x6 P
/ D" ?: O8 _: B" z3 R& T

  Z6 }+ {: w) o! wvoid ob_start(void); ) V/ y+ i2 ?4 V8 f

0 i" ~$ e; n2 M# i. E; ?2 M

" @4 t% s! V% u3 w本函数告诉 PHP 处理器把所有输出重定向到内部缓冲,调用这个函数后,就不会有输出到浏览器。 3 w  E! o& A6 e* x" z' C9 h
. \9 D9 w  c1 q* t

1 r8 U5 z7 q# Y8 ^8 sstring ob_get_contents(void); & }# U  R" C' m+ A1 }, J

( ]' K6 m3 g) V/ H/ L
1 B' Q8 o$ F! }- n3 {
本函数把输出缓冲返回到一个字符串,你可以用来把堆积起来的输出一起发送到浏览器。当然要先关掉缓冲。
2 Q& L4 f1 [* C! a+ b& a, o- F0 |# X

; F! j- w6 r: C2 e; P4 T6 Hint ob_get_length(void); * W. N% K/ J) U
; E2 k; Z7 f. v3 l, R- ^
4 F  `: E1 V) G  |/ t+ w* O5 Q% u
本函数返回输出缓冲的长度。 , M* V7 o3 ^8 F- [) ~& I4 e4 e
8 l& P, c4 e; T6 Q8 [5 ?
* Z7 ~9 A1 y: _& w1 A+ _
void ob_end_clean(void); - o6 \/ q5 Q9 e2 s6 s8 h; @$ z2 h
: l- D3 Z$ \) O1 u. Z
; L7 m9 S3 [. N! f
本函数清除并关闭缓冲。在输出到浏览器之前你需要使用这个函数。
5 V+ Q* Y% p* ?$ U1 _9 Q
8 @! K8 |6 A- p" w8 P0 _; _$ X

- F0 \6 [8 d5 Q/ C" \4 hvoid ob_implicit_flush ([int flag])
- j$ R: Q0 t$ c7 _; p4 A) J! _0 P) E3 n1 e: H. v: H) V6 H

0 g( T) f$ u! k本函数用来控制隐式缓冲泻出,缺省为 off,如果打开时,对每个 print/echo 或者输出命令的结果都发送到浏览器。 & V. d4 [! N4 s4 }. s0 I6 |

' W2 w3 F. f* T; w  G. L2 m
; V  k7 O7 N1 k6 J9 C% z, X

; J, m( U0 x6 i- l
; V" C8 f2 Q& |+ a1 v
二、采用输出控制来压缩 PHP 的输出 / b1 A! d# \& t6 G6 |, G4 K
3 w0 S6 \) _, b$ g! w$ m
+ ~8 _* `. y& D2 }4 \; l, G
在开始之前,要保证你的 PHP4 编译时支持 Zlib。
6 O9 Q# n- Q7 Z" E5 p! x1 c首先,初始化输出缓冲: $ p- o# f* Q4 _# C2 a8 C- @/ c
<?php 1 J! @7 a1 \/ y4 s' E' x# W# q; r. [$ @
ob_start();
/ ]3 I. V* V  p3 u* P: p0 q% vob_implicit_flush(0);
3 f1 k0 f% x1 b7 k4 T?>
) ?( ~! V8 u/ ^8 n7 ]4 E" }1 b: E* Z
0 |' d( B. n' r* N, X  c

. Z, R6 z# C% @" h* @$ Q! ]; p. y/ s( i! v( B

  \) m. S- ?7 X8 m8 t" a1 A! t/ [然后产生所有的输出内容。 9 l9 R1 v: U- J$ l! e! @

! F2 a7 b) w" p9 U8 @& u7 y# l
/ t, w* q$ `/ E5 o8 A8 W0 m: X
<?php 7 T! I0 v3 S1 Y+ T; x
print("本例为压缩输出!"); , A( f# o7 D' @  N; `' f9 L
?>
, R, r6 z" X3 x0 Q# |5 B2 {0 S. L9 m. N: g

3 g/ ]- u( d4 ~' j2 v页面生成以后,采用:
  B% W# V* \) O. w, k# n. ?' P$ y; x: g

" \" u! u% w$ `0 u: c; [0 q<?php
, C; s. Q, Z( F5 G. @& B) ~$contents = ob_get_contents(); 2 ~5 p5 M! L# S0 W6 g
ob_end_clean(); % {* H( B+ B. X' N
?> ! g: D! u/ N- b# K! i& e( C
% J  N( f* o7 p1 F7 H, M# [& C

# G- e+ I; D0 L  z4 o6 M还要检查浏览器是否支持压缩数据,我们采用在变量 $HTTP_ACCEPT_ENCODING 中检查 "gzip, deflate"的办法:
9 m3 z  H  y$ {2 Z& k. [# `3 v0 h) T% g7 O

6 @$ l! [9 ^& ?/ Y<?php
3 j+ p# K- k, oif(ereg('gzip, deflate',$HTTP_ACCEPT_ENCODING)) {
" u5 N6 d& ]4 U# W) ?// 产生 gzip 后的内容
! ?% {2 X' d4 n6 Q} else {
4 v$ K" e4 e) _# p# y+ r9 \# vecho $contents; + g# U; T6 B2 m- E1 g: u
}   M) a7 s% C! i
?>
# Y& s7 t. d- s  e+ w+ j
- w! x; e* s7 u
- o2 ?/ G% U. B) y/ r, l; U1 `
下面我们分析怎样产生 gzip 输出:   G4 T6 {% Z8 D- b: L0 e
' q/ K1 N2 J- K# y

3 |% E. c2 I2 }) [<?php ; I0 y" x- I# q+ g+ r: h
// 告诉浏览器下面接收的是 gzip 数据。
; Y+ R; k- v3 {( G" Z" Rheader("Content-Encoding: gzip");
+ k; @: t* K1 `( V" h; W+ |// 显示 gzip 文件的文件头
$ O" H3 t  z8 L. P) g9 X// 只要一次就够了   u( A3 T4 y2 ~/ X1 N4 O% \
echo "x1fx8bx08x00x00x00x00x00";
) U# N3 k: p& W3 l* `// 计算长度和 CRC 校验码
9 c7 K  a0 B7 T4 |. t$Size = strlen($contents); 7 x) Z; I; o3 O( c
$Crc = crc32($contents); " p, a2 V7 @5 U, @% v- q! h8 n
// 压缩数据
! d- {& L, d! Y+ [( c, F% n$contents = gzcompress($contents, 9);
/ f3 A7 a4 }  \3 Z- @2 H& U// 不能直接在这里输出内容,因为还没有写入 CRC 呢! 4 D( _; A% W' O0 X3 T  I
$contents = substr($contents, 0, strlen($contents) - 4);
' |. p" w& A3 ~echo $contents;
1 P  `. W8 Q0 [; t6 k- t- Bgzip_PrintFourChars($Crc); 7 X8 F; [; ~7 w# A  ?. E& C
gzip_PrintFourChars($Size); $ A. a- g/ {* I" K. s
function gzip_PrintFourChars($Val) { - a+ ^* c8 m, z  N0 C( n* B$ }
for ($i = 0; $i < 4; $i ++) {
  {$ v8 \4 Q8 p+ Qecho chr($Val % 256); # ^3 E7 N" V% t8 U5 Q
$Val = floor($Val / 256);
0 O1 C' J* @, g2 l; Z} 4 l* j3 z7 {; g2 z6 [& Q" e0 F
} 9 @6 _3 ~* M  j& u, ]- B
?> $ V/ I$ g( B2 o9 O3 W& L, H5 X

- e6 t5 q( h0 e: d* ?9 C

& Z' O, _7 o' ^三、缓冲 PHP 的输出
) Z- o7 e$ F9 u
# F$ F* ]6 W* f  b5 y+ k% y. x
. `  O5 z& _" ?1 O9 D' [0 R
在 PHP4 里能很容易的实现缓冲,我们来看例子:
7 k( D, o& G" `, n5 i& f; e/ u: P* m

$ T9 J1 c5 z, E2 n<?php 3 t! \% Y. `# E
// 对请求的 URI 产生唯一的文件名。 , i7 [, L: p' G5 A- d" z
$cached_file=md5($REQUEST_URI); - d! R* @/ R* h1 y
if((!file_exists("/cache/$cached_file"))||(!is_valid("/cache/$cached_file"))) {
  x0 ^- {0 D: G% K, z5 Yob_start(); % X8 M/ ^  [  h& p: a' z
ob_implicit_flush(0);
* w! i" C- u  D// 在这里输出缓冲 % @1 p7 f- v/ e3 w. l
$contents = ob_get_contents(); ( S9 [' Q) x* e& z- V4 \
ob_end_clean(); 3 V. x4 r- g, z
$fil=fopen($cached_file,"w+");
7 }% O: |$ J8 Q7 bfwrite($fil,$contents,$strlen($contents));
" s6 d* R* I) _7 c  \: v% nfclose($fil);
5 g- p8 m$ c# J. i7 {; [}
+ {  c2 d# [5 s! m" t1 |& \0 c& ]7 O2 y4 }& [

( b$ P, V: X- r6 k- y, Z7 t/ Breadfile($cached_file); ! s  }+ M5 {8 T  N* X
?>
2 N( ]3 _3 b: w3 F: g. C2 s3 i! ?0 ~  }( d- d, S+ F* f* W/ b  g
$ [& a1 E, }, r% z# h
四、结论 . E6 U8 y6 N) D2 b1 O4 R. T
. X: q, s1 f! _. e

- s7 {6 W  }$ x: lPHP 输出缓冲函数在操作脚本输出方面十分有用,把缓冲压缩后输出能减少 80% 的输出时间,这对于存取其他数据资源(例如数据库或者 XML)来说,也是一个很好的缓冲机制。 ( G/ r6 Q( b& q& L
% }, k4 v1 v7 Q% w
You look down on me today, tomorrow I can't let you have been

精彩评论21

zuantanduila 发表于 2016-6-1 08:05:16 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
钻f探e 发表于 2016-6-7 13:03:27 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
广翠宪 发表于 2016-6-26 05:07:59 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
珍妨莲 发表于 2016-6-26 15:27:51 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
保庆燕 发表于 2016-6-26 15:30:43 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
汎阿青 发表于 2016-6-26 19:08:32 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
珍妨莲 发表于 2016-6-26 21:44:18 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
arskg 发表于 2016-9-19 23:38:55 | 显示全部楼层
哈哈,楼主不错
* Q  T- w  C" ~4 v6 A' E$ {5 K" W7 d2 A: f' L' C, B# g" N

/ p1 [( ?4 `5 y  \/ g7 s! ]0 }" ^+ t( W
# U8 }8 U4 e5 {# V3 i2 \2 m7 u" t

5 w# @% _% ~: U7 Y, i! m3 X' y# s6 _" z0 e; E, H2 p  o3 Q# Z
! x% I! m) }4 d5 `

* x( Y9 [" x. z  U
% n. B8 ?  j, i3 T+ r+ x* o# b. \
; h" n. N. i& h$ a; K7 Q6 A/ `8 I1 H* u- L) x# z" r+ O
php?mod=logging&action=login'+'&referer='+encodeURIComponent(location))" src="static/image/common/sigline.gif" border="0" alt="" />
' n/ Y5 G! p" w3 i2 \$ f1 ?! B0 Z                               
php?mod=logging&action=login" onclick="showWindow('login', this.href+'&referer='+encodeURIComponent(location));">登录/注册后可看大图
1 Q: F8 W6 o$ q- e  {
深圳供给19V3.7A桌面式电源适配器
arskg 发表于 2016-10-28 11:15:21 | 显示全部楼层
好多啊,哈哈,谢谢您/ J/ b1 g, V9 L/ \- g, J

+ C) D' ^# D3 O7 O$ h. B3 Y9 H3 z2 ?$ z& d. U) F* ~

# U8 i$ [' X7 m  j( y2 W* N' |. ?* B3 e: n/ s, N  ]( P
9 {1 z  c/ E- m) Z/ \

8 R7 K. o% \( I3 h
3 \" g" T1 U3 Z, k6 S3 h8 _3 W# z9 [3 J

" S4 t) ~3 |! M5 W: b% Y( }- [, t- N; P& C
! t, P% c4 c. a3 a: Y, F
php?mod=logging&action=login'+'&referer='+encodeURIComponent(location))" src="static/image/common/sigline.gif" border="0" alt="" />
( g/ c" u/ s  g5 C5 L( ^0 G4 M! Z                               
php?mod=logging&action=login" onclick="showWindow('login', this.href+'&referer='+encodeURIComponent(location));">登录/注册后可看大图

8 K  X7 ~8 D7 ~% y- Y( I; |8 p厂家供给5V6A开关电源

关注0

粉丝6

帖子3328

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

扫描微信二维码

关注华域联盟公众号

随时了解更新最新资讯

admin@cnhackhy.com

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

在线QQ客服

Powered by cnhackhy! © 2015-2019