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

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

PHP的十个高级技巧(下)

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

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

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

x
六、动态图像的创建 6 r4 Y+ F; B& q9 [, r8 `
  只要安装一些第三方的库文件并具有一定的几何知识,就可以利用PHP来创建和处理图像了。事实上,这不需要太多的几何知识,因为我大学没有毕业,仍然可以利用PHP创建图像。 ( S; X7 H" @+ H, l: c

8 `( U  K; m) J7 v  在使用基本的图像创建函数之前,需要安装GD库文件。如果要使用与JPEG有关的图像创建函数,还需要安装jpeg-6b,如果要在图像中使用Type 1型字体,则必须安装t1lib。
' h2 \% Z# J& e" x0 S2 e+ `; L! V9 F& o) {& ^
  在建立图像创建环境之前,还需要作一些准备工作。首先,安装t1lib;其次安装jpeg-6b,然后再安装GD库文件。在安装时一定要按这里给定的顺序进行安装,因为在编译GD为库时会用到jpeg-6b,如果没有安装jpeg-6b,在编译时就会出错。 . @1 L) ]/ o7 s9 k* {1 j
& r; z0 s2 @0 N. Q
  在安装完这三个组件后,还需要重新配置PHP,这也是你对采用DSO方式安装PHP感到庆幸的地方之一。运行make clean,然后在当前的配置中添加下面的内容: 8 K, Y/ W9 F( ~! n. S2 S6 C- T

$ c8 A1 k+ |" @: p3 ^8 L  --with-gd=[/path/to/gd]
) ]+ D: r( Y- O  --with-jpeg-dir=[/path/to/jpeg-6b]
; X" v4 |9 z1 c# Q# E/ K$ t$ m  --with-t1lib=[/path/to/t1lib]
  Q: M  y3 S/ ?4 N7 \  完成添加后执行make命令,然后再执行make install命令。重新启动Apache后运行phpinfo()来检查一下新的设置是否生效了。现在就可以开始图像创建工作了。
1 ^& }7 d% ~+ `
5 y8 u6 |, a& Q  h& d% P+ f  根据所安装的GD库文件的版本不同,你也许能或者不能创建GIF或PNG格式的图形文件,如果安装的是gd-1.6或以前的版本,可以使用GIF格式的文件但不能创建PNG格式,如果安装的是gd-1.6以后的版本,可以创建PNG文件但不能创建GIF格式的文件。
  }. \! d( L4 m' O9 ]" n6 d& v& D5 _& u- G* G
  创建一幅简单的图像也需要用到许多的函数,我们将一步一步地进行说明。 3 ]/ L$ T! G6 b& R0 m
" Y+ ?* s& O3 L* s2 d/ |
  在这个例子中,我们将创建一个PNG格式的图像文件,下面的代码是一个包含所创建的图像的MIME类型的头部: . X' k7 _/ r* w2 F. r

* p6 q/ u) P* h6 |" \/ Q  <? header ("Content-type: image/png");
* [- u6 e: M/ V- o& E4 t; I. }7 ?5 e/ H  O7 r
  使用ImageCreate()创建一个代表空白图像的变量,这个函数要求以像素为单位的图像大小的参数,其格式是ImageCreate(x_size, y_size)。如果要创建一个大小为250X250的图像,就可以使用下面的语句: 4 R& F+ r0 H2 u1 j- l! ?5 G
) |) t' M3 s/ O& y8 Z% _
  $newImg = ImageCreate(250,250);
$ Y9 n9 f8 v7 `9 _1 s# `+ c* h0 B: F
  由于图像还是空白的,因此你可能会希望用一些彩色来填充它。然而,你需要首先使用ImageColorAllocate()函数用其RGB值为这种颜色指定一个名字,这一函数的格式为ImageColorAllocate([image], [red], [green], [blue])。如果要定义天蓝色,可以使用如下的语句:
2 A4 k, b+ K7 J9 ^7 y, Z6 ?9 x+ ?1 l: L" M0 l
  $skyblue = ImageColorAllocate($newImg,136,193,255); $ U  a0 W* R" x/ |& d2 x

  j, x8 [& D1 q; k/ X' ]! `  接下来,需要使用ImageFill()函数用这种颜色填充这个图像,ImageFill()函数有几个版本,例如ImageFillRectangle()、ImageFillPolygon()等。为简单起见,我们通过如下的格式使用ImageFill()函数:
( h0 T: C! @7 \8 o. g
+ {: f; c3 [1 d' L" C2 O  ImageFill([image], [start x point], [start y point], [color])
3 M4 N# |9 u# e* n6 ]8 y9 M  ImageFill($newImg,0,0,$skyblue);
4 ?; n6 ?$ ?1 l0 I6 c5 t! m& O- C7 l0 z0 q6 k! Y  F
  最后,建立图像后释放图像句柄和所占用的内存: , p* Y, Y4 D! f' \( X
! R  C1 B% ?% R: [; l9 p
  ImagePNG($newImg); # \/ {% j# }" o, j
  ImageDestroy($newImg); ?>
& q/ v4 _- H+ t9 Y* ]$ ]# g
8 F+ t5 M$ a! |6 {0 s8 ]* F" ]  这样,创建图像的全部代码如下所示:
! X0 X  |& X  U% {+ n# t! H/ X% P. [5 ~$ i
  <? header ("Content-type: image/png");
; O0 Z) j% r+ E9 e9 `6 M  $newImg = ImageCreate(250,250); ' W5 U7 S- p) B! j, l( A' C- n% {
  $skyblue = ImageColorAllocate($newImg,136,193,255);
9 A3 R4 |  J- |2 h  ImageFill($newImg,0,0,$skyblue);
) v/ F& I( Z. E8 P. A  ImagePNG($newImg); 4 Q1 M( u9 A9 r% s7 R6 Q" ]# h
  ImageDestroy($newImg); % Y( Q5 ^; p8 c0 }) B5 }0 }6 n
  ?>
( `9 J0 d. \: ~( @' i9 n' g7 s; p' ]3 |6 u" _4 ]
  如果把这个脚本文件保存为skyblue.php,并用浏览器访问它,就会看到一个天蓝色的250X250的PNG格式的图像。 + d' d! u  _3 p7 \

: i5 W6 p  C* \% P/ y  我们还可以使用图像创建函数对图像进行处理,例如把一个较大图像作成一个小图像:
3 t% Q' \. Z6 ?# C( i  假设你有一幅图像,想从中裁剪出一个35X35大小的图像。你所需要作的是创建一个35X35大小的空白图像,创建一个包含原来图像的图像流,然后把一个经过调整大小的原来的图像放到新的空白图像中。
% l# d3 V3 B) H8 R- b  要完成这一任务的关健函数是ImageCopyResized(),它要求的格式如下所示:   J% M" c6 u3 c$ s
+ N- k& ^2 o5 G/ X% X
ImageCopyResized([new image handle], 3 l! F. Z4 m2 C7 m% w
[original image handle],
; }( z) X: t. I; z) O0 X[new image X], ! j( i- }+ q" E$ j9 r
[new Image Y],
5 [$ e8 T- U, A; c$ e1 @[original image X], $ ~( ]3 X4 g* A% @
[original image Y],
1 z; y1 Q0 ?$ V[new image X], [new image Y], 8 j. v5 ~1 K1 A& s4 N" u
[original image X],
) ?6 f& B' q6 r4 S[original image Y])1 u9 W& c, d3 W. A2 I/ o  P

- I  l5 Z, b/ g$ \  <? /* 发送一个头部,以便让浏览器知道该文件所包含的内容类型*/ 5 S7 r0 D, i. `* V- T  Z( o
  header("Content-type: image/png"); " X0 h* {* j. r( Q1 h
  /* 建立保存新图像高度和宽度的变量*/ - L/ f/ n* j1 t) L
  $newWidth = 35;
: [9 Z8 U- [) _9 {5 i  $newHeight = 35;
$ Y/ r* q3 X& b; }  /* 建立给定高度和宽度的新的空白图像*/
, g8 l1 P6 J& S- F* n1 g# \  $newImg = ImageCreate($newWidth,$newHeight); , l* }, v( u. b
  /* 从原来较大的图像中得到数据*/
. g& \8 _( n- [2 o3 a. c9 J5 p  $origImg = ImageCreateFromPNG("test.png"); * \: K# }7 [6 V7 M" ?
  /*拷贝调整大小后的图像,使用ImageSX()、ImageSY()得到原来的图像在X、Y方面上的大小 */ 1 h: v6 ^# J3 {: R
  ImageCopyResized($newImg,$origImg,0,0,0,0,$newWidth,$newHeight,ImageSX($origImg),ImageSY($origImg));
# D0 H2 ^) C, W) Z9 l  G /*创建希望得到的图像,释放内存 */ # b, K; P" Z  k+ c" D! F% N
  ImagePNG($newImg);
7 k7 w; E2 i  Z8 g4 f  ImageDestroy($newImg); ?>
4 D& e, C2 v2 f9 b  h
: V/ W* }0 i+ D( g7 S& c  如果把这一小段脚本保存为resized.php,然后用浏览器对它进行访问,就会看到一个35X35大小的PNG格式的图形。 ) J5 |! e4 a" r% W
9 L7 h7 A+ h; {  b1 k5 v/ n
七、基于PHP的用户认证
" z% B6 n. _% `$ g+ B' ]/ W# |5 _4 Q. K3 l; p
  如果希望在每一段脚本上都进行口令保护,可以结合使用header()语句、$PHP_AUTH_USER和$PHP_AUTH_PW来建立基本的认证方案,通常的基于服务器的提问/响应顺序都如下所示:
& d7 C  {8 V1 [6 U6 }' Z, `+ Z: l* I4 h& O
  1、用户从服务器上请求一个文件。如果这个文件在服务器上是被保护的,则在响应的头部向用户返回一个401(示经授权的用户)字符串。 3 p: v  G  o1 T' L+ |$ c
  2、浏览器收到这个响应后,弹出要求用户输入用户名/口令的对话框。
- A$ h) h4 k* u3 r  3、用户在对话框中输入一个用户名和口令,点击OK按钮将信息返回服务器供认证使用。 7 ~9 O/ s' ]/ }8 K7 N3 Q% K
  4、如果用户名和口令有效,被保护的文件将向用户开放,只要用户还在使用文件,认证会一直有效。 5 C6 p- ~& }1 c

* J. a( b: ~4 j  一段简单的PHP脚本文件通过向用户发送一个适当的能够引起自动显示用户名/口令对话框的HTTP头部就可以模仿HTTP的提问/响应系统,PHP把用户在用户名/口令对话框中输入的信息存储在$PHP_AUTH_USER和$PHP_AUTH_PW中,使用这二个变量,就可以与存储在文本文件、数据库等文件中的用户名/口令进行比较。
7 s6 S0 s6 Q) j0 D% P* U! f; `! v& C- E/ U# m
  这个例子采用了二个硬编码的值进行认证,但无论用户名和口令放在什么地方,其原理都是相同的。 , z7 Q/ d% M/ D9 \% M

+ h5 ~$ d3 p6 M) _9 P, S  <?
/ `  N% t0 Y! l& ]/ Y  `; K8 x  /* 检查$PHP_AUTH_USER和$PHP_AUTH_PW中的值*/
. w& v4 a. q( F" }& C' S  T# f* l2 k  if ((!isset($PHP_AUTH_USER)) || (!isset($PHP_AUTH_PW))) { 5 T+ [& T* n; v4 E, _9 q
  /* 如果没有值,则发送一个能够引发对话框出现的头部*/
1 W% O9 O* p4 F3 N' F3 t  header('WWW-Authenticate: Basic realm="My Private Stuff"'); 9 K. U  v8 T( I) X8 X& s
  header('HTTP/1.0 401 Unauthorized'); ; l! x- p; P) j7 @0 p* W
  echo 'Authorization Required.';
; t% }1 ]7 Y( Y$ i( z  exit;
2 s  G3 _- H, j  } else if ((isset($PHP_AUTH_USER)) && (isset($PHP_AUTH_PW))){
7 y% E% y4 k9 A& Z( d5 I, ^6 [  /* 变量中有值,检查它们是否正确*/
# g! f9 s% k9 `5 m6 c  if (($PHP_AUTH_USER != "validname") || ($PHP_AUTH_PW != "goodpassword")) {
5 z% N% p5 v( {" _   /* 如果输入的用户名和口令中有一个不正确,则发送一个能够引发对话框出现的头部 */
# W1 n, P  Z5 ]3 J$ m3 D9 _   header('WWW-Authenticate: Basic realm="My Private Stuff"');
$ [) n" p+ Z5 G   header('HTTP/1.0 401 Unauthorized'); ( L, O+ h" |) ~: ?! z! H# O+ W3 M
  echo 'Authorization Required.';
( v% i! K' e& W, q# x  exit;
! V0 N5 K- h3 X8 ~  } else if (($PHP_AUTH_USER == "validname") || ($PHP_AUTH_PW == "goodpassword")) {
. u1 k5 w' X" C. Q/ j  /* 如果二个值都正确,显示成功的信息 */
) b! x: \5 x9 s8 |  echo "<P>You're authorized!</p>";
4 q7 J' p7 \) \5 ~8 w  }
' j8 t$ u4 J2 q# U! T6 ^+ H# N  } ; b' d9 j" u! ~8 i7 K" {
  ?> 8 u9 a& m( G1 i/ J9 b
: b+ o. _2 C2 N# t8 m$ f
  需要注意的是,如果你使用的是基于文件的保护机制,它并不能保证目录中所有的文件的安全。它可能保护大部分的文件,如果你认为它能够保护给定目录中的所有文件,你的这种认识就需要变变了。 ! |$ V3 l2 Z# }5 y/ o$ g& {4 d
- H2 N9 H3 ?* R
八、PHP和COM   \; S3 O- s- J/ j$ ^
  如果你喜欢冒险,并且在Windows上运行CGI、ISAPI或Apache模块版本的PHP,就可以访问COM的函数。好了,详细解释COM的工作就交给微软和许多大部头的书了,为了能简单地了解一下COM的功能,下面是一小段常见的脚本4 C0 e8 L( C. n0 w, E
5 Y3 _% I3 z$ L, M5 ^2 J( q! U" V
  这一段PHP脚本在后端启动微软的字处理Word,打开一个新的文档,输入一些文字,保存文档,并关闭Word。
: _% {( g! X6 J; G* x9 c! X  <? 1 A  i9 q& Y9 ~" a$ J" D
  // 建立一个指向新COM组件的索引
8 E8 _5 H7 |5 m# L  O  $word = new COM("word.application") or die("Can't start Word!");
+ f5 F. y+ @# p- v' l& v! J( \8 r  // 显示目前正在使用的Word的版本号
8 k% W/ s5 W$ S; G  echo "Loading Word, v. {$word->Version}<br>";
) R8 l6 H* i4 x' U; s4 x& b  // 把它的可见性设置为0(假),如果要使它在最前端打开,使用1(真) ' ]8 t3 l) _; R- J
  // to open the application in the forefront, use 1 (true) ) u0 W8 t, M1 T* M
  $word->Visible = 0;
# B; q3 u6 y- |  // 在Word中创建新的文档 7 Y3 B6 d  J+ R- h, {. I
  $word->Documents->Add();
& R: z# y% w. }3 b( I5 O  // 在新文档中添加文字
0 K, \( ?! F$ m  $word->Selection->TypeText("Testing 1-2-3..."); 1 A0 J1 G( O- M. Y7 J
  //把文档保存在Windows临时目录中 & b2 n8 i- C' `6 W! j
  $word->Documents[1]->SaveAs("/Windows/temp/comtest.doc"); 2 `, L* k2 m  T( C0 W! I% ~
  // 关闭与COM组件之间的连接 2 R+ e4 A0 [7 u) E6 _! F) t& M5 q" d
  $word->Quit();
2 h2 }6 x' {0 d! U9 c  // 在屏幕上显示其他信息 0 H% k' v- H" P9 d
  echo "Check for the file...";
7 y9 @8 y/ p; c6 I  Q, k  ?>
, \9 O$ I! n  I, |" Z! `6 X  如果你有一个intranet网站,数据存储在SQL Server中,用户需要这些数据的Excel格式,则可以让PHP运行必要的SQL查询并对输出进行格式化,然后利用COM打开Excel,把数据转化为Excel格式的数据,然后把数据保存在用户的台式机上。 . z# N2 |: o* H/ K# m  F2 X

: _- D# _* G. J& C! P0 y九、PHP和Java
( `  z- y& Q- o/ [7 Q! t# f5 {/ p  PHP另一个有趣的功能是它可以调用现有的Java 对象中的方法,使得你可以在基于Java的应用中集成PHP。如果要在工作中推广PHP的应用,这一功能就非常有用了,你得到的结果是,“这里的一切都是基于Java的。”
; z$ g+ T& _8 f1 R  要利用这一功能,你的服务器上必须安装有JVM(Java虚拟机器)。如果安装的是由Sun、Kaffe、IBM或Blackdown的JDK,就已经安装有了JVM。 " `. Y/ w$ P6 _, \: J

8 j, @4 w3 u2 c, B( T  在配置PHP时,需要在配置文件中添加with-java小节,然后修改php.ini文件中的一部分,对php.ini文件的修改主要是需要添加下面的内容:
2 f: F% ?! R' ~" o- Y9 s% g3 T
8 N% s; }8 _' M  [Java] 6 R) Q5 V; l* U# ^6 \
  java.library.path=/path/to/library : ]. Q; S1 t9 H, W6 c5 g+ y0 w
  java.class.path=/classpath/
. H  r+ q( w$ L* F& e. Y  extension_dir=/path/to/extensions
" t2 ]' M' n5 a  {  extension=libphp_java.so / P) l: z  B7 L0 Q0 B

4 `1 ^4 [. p1 C; h  需要注意的是,所作的修改与你的安装类型有关,你需要阅读PHP安装目录下ext/java目录中README文件,学习如何配置Java功能。
" _  e9 v* b7 \' K- n
; E) P  K9 z& C0 s( ]  下面是一段如何创建一个新的Java对象的PHP脚本的例子,这段脚本将访问并在显示器是显示一些Java属性。它与COM的例子同样有趣,应该会给我们一些启发。
8 f8 `/ `: |) q# b  <? 1 L; l0 m  U, \/ B; f6 U1 L3 ]
  $system = new Java("java.lang.System"); % n. P' |9 U5 v& e2 U, C
  echo "<P>Java version = " . $system->getProperty("java.version") . "<br>"; - Q7 m: b9 C$ c2 T# Y
  echo "Java vendor = " . $system->getProperty("java.vendor") . "</p>";
# f: R4 b+ S2 z; c: V  ?>
& a& p8 h! L9 C8 Y6 o0 l, u  如果你有Java知识,将会对开发工作带来很大的帮助,这种集成的能力是未来PHP被接受和增长的关健。   L) f3 r3 D. Z8 _& g7 ^0 r

5 d1 N% Z' b. a十、PHP和XML
  T0 s% N# k# h% K$ c  PHP中包含有一个可选的支持Expat解析的XML扩展,利用PHP中与XML相关的函数,可以创建一个分析程序来处理有效的XML文档。如果你使用的是1.3.7版或版本更高的Apache软件,就不需要再安装额外的库文件了,你所需要作的就只是配置PHP中的with-xml。 $ X; J% n& }+ j/ d

( P( E: X8 _! x  H% v! @# h6 q# v3 u' A  象Java和COM一样,PHP中对XML的支持也很有趣,而且增长也很快,如果你了解Expat或LibXML,请加入这一方面的开发吧。( z9 X' L  P2 u- I4 F2 R% t9 \

9 r% u7 |, {# l! L# _' W
You look down on me today, tomorrow I can't let you have been

精彩评论19

sqsyc 发表于 2016-5-30 14:43:27 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
zuantanduila 发表于 2016-6-1 12:06:33 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
钻f探e 发表于 2016-6-25 06:05:07 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
汎阿青 发表于 2016-6-25 21:25:11 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
花传贺 发表于 2016-6-26 13:01:36 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
宏艳昌 发表于 2016-6-26 13:04:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
珍妨莲 发表于 2016-6-26 15:18:39 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
潮务点 发表于 2016-6-26 17:10:59 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
登洲远 发表于 2016-6-26 21:22:28 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

关注0

粉丝6

帖子3328

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

扫描微信二维码

关注华域联盟公众号

随时了解更新最新资讯

admin@cnhackhy.com

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

在线QQ客服

Powered by cnhackhy! © 2015-2019