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

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

php编写大型网站问题集

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

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

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

x
PHP以其易用性得到迅速的推广,但易用并不是说就能用好它,实际上许多程序员用它很容易的立一个个WEB应用系统,但又有多少人仔细的考虑过他们的代码,是否容易维护、是否足够健壮、否效率足够高、是否足够安全,当PHP用于建立大型网站时这些就成为很关键的因素。下面我们从较轻微的问题开始讨论,直至一些致命的错误。共分三部分。 % [- ?$ V! |: k! A8 h0 }

# i0 C& B: T: w" B第一部分、较轻微的错误 . ^- U- r! D. @4 P7 `! N9 ?) V

: C7 f$ b6 b( d7 r+ F一、Printf(),
% A/ O( y5 z' s  该函数主要用来格式化显示数据。当你要改变某个数据的显示格式时才使用。例如以不同的精度来显示PI(3.1415926)的值。
! x+ ?8 |, F& H8 [: W; n8 o' m9 i8 }4 Y# c. [% Z6 y) t
<?php ! ^( b$ a4 C8 O8 B' J9 o
 /*
9 B6 q* {9 x, k  ~. c6 { * The three faces of Π
& h2 d6 W2 M* y8 z */
+ Y$ G  _2 A% A7 R. q7 e printf ("Pi is: %.2fn<br>n", M_PI);
9 K4 ]6 ~8 l& j: t0 g. e printf ("Pi is also: %.3fn<br>n", M_PI);
7 z( n% s- i0 A) E printf ("Pi is also: %.4fn<br>n", M_PI); " Y6 w/ L5 A( \+ y* O! z
?>
" D& }+ Y8 P' Y! @* a9 K" G# A5 A6 D& E! F: r0 H5 x2 Q
  但许多程序员仅仅为显示一些变量值和函数返回值使用该函数。因为Printf()在显示数据前要先格式化该数据以速度较慢,因此,仅为了显示数据时应用print和echo,以提高速度。 6 Y0 \* M' w3 p! N" B9 `
5 G" a0 C6 W5 i$ g; b6 p
二、语意检查 + A, e: z. M' |1 I- U  X
  PHP是一种弱类型语言,也就是说在使用一个变量前不用定义,这样给编程带来了很大的方便和灵活,但你自己必须知道该变量到底应该是哪种类型,因为该变量在运行时仍实际对应着某一种类型(各种类型之间可以自由互相转换),没有类型的变量是不存在的。有可能PHP并不能检查出你的语意错误,但由于变量类型的变化,会导致一些潜在的问题的发生。另外一个值得注意的问题是变量的范围,它也可能会导致一些潜在的问题的发生。
7 m( G2 r6 P  d& J. |7 Z* i2 B0 M- f; k
在PHP中有以下几种基本变量:
% w9 V0 M% s: Y+ p  h) nBoolean, resource, integer, double, string, array and object。
+ _. ~, k  V) G
% j4 P; \8 j) n& f" G三、临时变量的使用 5 E) q5 @3 U. w3 \6 _5 k4 j+ }! C2 b' s
  临时变量的滥用会导致程序运行效率的降低。何时使用临时变量可基于以下两点考虑:
! `8 `% x& v5 @7 ?2 t$ K8 G. m7 s
1、该变量是否至少使用两次。 ; Q  r8 ^! Z$ j- \9 U5 M# ^
2、该变量的使用是否会显著提高程序的可读性。
8 [& v. h8 r/ s7 k; j' ]
* Y2 p0 u# v" Y1 x如果一条也不满足,则省略该变量的使用。例如:; q# [5 S7 V8 }: ~0 M* T

+ f$ x9 `7 {8 K& l<?php 3 o% t( b1 n8 k' N
 $tmp = date ("F d, h:i a"); /* ie January 3, 2:30 pm */
9 k& X9 n4 X$ Q% F! e print $tmp; 6 ?4 G: a/ P- B% r) K" ?
?>
! r) ], j, F3 P6 V
. p2 K7 ]2 o8 t就应该改成: 3 A8 f" B" |8 X" J% `
+ s. T' r5 B* Y' D6 N6 b) p
<?php
9 [* @2 D5 N+ _( F3 a print date ("F d, h:i a"); 4 K* @% \2 }, C8 ]8 S2 v
?> 9 ?3 }% I9 e7 `" q& w* w1 t8 z0 i

) R$ l9 Y( |* c又如:
$ o% w' b2 ]* y. ^+ E8 `, E& S* @8 H+ Y, B0 l2 v
<?php
) ]* o6 g7 s* }: n// string reverse_characters(string str) 3 K3 L4 H. E7 e" g7 X
// Reverse all of the characters in a string. . H' \( S, W6 r# |: W& f* G
function reverse_characters ($str)
$ f6 d& C1 U+ R* t  z{ # h( c/ P& ~" x# {( U: t
 return implode ("", array_reverse (preg_split("//", $str))); 4 t1 y3 F( b- C8 \* z$ e6 N
}
2 f6 _) R  D% X! r, U8 y?>
2 a$ O$ n9 i& p8 p  {* O& q8 |4 ]% d0 X
的可读性不强,可改成: ! t& L, q. y0 n
; s* [7 Y6 S/ n4 s2 U
<?php
, Q# B- [; Q4 f/ Y// string reverse_characters(string str) ) u/ b3 K" Z# P* O& T7 o4 ^+ M
// Reverse all of the characters in a string. ( _% o' k/ R8 M; \
function reverse_characters ($str) 6 w  O1 i7 X/ x! C5 X% L1 t
{ $ q2 _& _/ v; _% `: w" Y  ]6 Z7 K
 $characters = preg_split ("//", $str); 2 r$ O0 @. m- x6 s
 $characters = array_reverse ($characters);
2 O% D4 r( M& d return implode ("", $characters); 9 k7 Y8 B3 T% Z# i0 ^8 u8 f
} + {) L* y: v' ?5 H7 X! c
?> & i( C# V" |. z9 H. U6 K* z
: ?6 C  \8 |# u+ P$ U
四、客户端和服务器端代码的分离 4 N/ V; t" o- j/ r( ]1 p  ~, T
  客户端和服务器端代码的在PHP程序中实际上就是HTML代码和PHP语言代码,很多人把HTML和PHP语句混合在一个文件里,使得这文件很大,这种风格对程序的维护和再开发很不利,不适合大型站点的开发。一般有两种方法把HTML和PHP语句分开: % X  C! y2 H( b# k

( m8 {! i! I3 a* q1 ^1、编写专用API,例如: % H; W, i0 p. c( E. q! I0 j, F- s

3 H) g: F  E- e! W5 F6 Y2 P* T0 vindex.php ? The Client side
9 ]' A, _9 P1 Z9 ], R: j8 v, ~8 v: w+ D- s) `0 M+ v
<?php include_once ("site.lib"); ?>
' l2 O' ]/ t5 b<html>
+ d& s' V: |  `* F<head> 8 \7 P) _* v1 m: [3 ]0 Y0 c2 i
<title> <?php print_header (); ?> </title> 6 `" E5 a% R6 Y$ j0 @( A( [  {; k
</head> ! W( `+ z, N5 z, F1 D- y
<body>
. u. v. y' b& n<h1> <?php print_header (); ?> </h1>
- ]1 w9 D, @- p. H) G0 e) f<table border="0" cellpadding="0" cellspacing="0"> : D- d, c  S8 U2 q/ n% h
<tr>
6 e( R! I# ~% J& E# j- S. g' N<td width="25%">
. J+ x2 o8 [/ e" }6 E<?php print_links (); ?>
9 @3 D  k$ {8 O( R( f" G</td>
: Z2 f# {- B: z<td>
! x8 C# e! O8 j5 J( r6 m% x6 [<?php print_body (); ?> ' `, L: l9 t! x; [, Z0 A
</td> . P8 A! h! v# a, g. e* w( Y; ]
</tr> ' c/ t7 ?! I. E* I
</table> 9 c# d9 ~0 `8 t1 s$ @
</body>
- c2 u, g, N$ X' K. X. W) O</html>
2 l. D- z4 B0 Y9 H8 o, j3 K* v+ J% d, |3 Z+ k( v' ?$ d1 q* S
site.lib ? The server side code
% n1 L7 @* ?& c3 \
0 [5 R7 `0 y; Q7 x1 p; _( V<?php
" T" x4 G. p( w2 f$dbh = mysql_connect ("localhost", "sh", "pass") or die (sprintf ("Cannot connect to MySQL [%s]: %s", mysql_errno (), mysql_error ()));
! J$ Q/ b$ q7 n1 c% r. b@mysql_select_db ("MainSite") or die (sprintf ("Cannot select database [%s]: %s",mysql_errno (), mysql_error ())); # X) c. s+ e" v0 J& t/ ]
$sth = @mysql_query ("SELECT * FROM site", $dbh) or die (sprintf ("Cannot execute query [%s]: %s", mysql_errno (), mysql_error ())); & b8 X/ \7 P! ~# c' d( B# V# `

% X8 Y9 C% H* ]2 i$ E$site_info = mysql_fetch_object ($sth);
, [+ D. A4 v& K7 q: H; F# X* \- x1 V4 k
function print_header ()
# i0 T% H5 Y6 y  |1 ]{ ! U* I* g- c$ K4 a4 v
 global $site_info; 4 H. T* @; r% j
 print $site_info->header; 7 }- G1 S' L% R  ]* W% N3 C6 |
} 4 \3 H6 }. o0 o  ?2 C; V( |
: ^# c$ y2 ^* ]! h- h% R
function print_body () , {- F" l8 w+ C" [! f# j3 B  L" a
{
# O% z$ E8 D* e, p global $site_info;
, {. V' r( G$ j; Z$ a print nl2br ($site_info->body); 8 l  C4 Y2 d+ O4 S
} " D1 s& p+ @* N( {& @' p* J7 j

3 y- {% ]0 ~9 ofunction print_links () , W, I% z- E1 p. c1 y2 ]6 j
{
/ k: d' U$ s8 J- d: G9 |: L global $site_info;
4 [$ U  S. N% I! m. I0 \% c& d8 I2 [, H3 Y* R4 y* {% W
 $links = explode ("n", $site_info->links); 2 x4 Z; C) ?) v$ L
 $names = explode ("n", $site_info->link_names); 7 f8 b( H! R) `, I
5 ^7 [3 ^$ t$ _1 u, y0 h7 e# \5 K4 O
for ($i = 0; $i < count ($links); $i++) 7 H" O! Q" O' N* w, H6 F; |8 d& \# k
{ + L+ t' _6 e7 h0 _# f
 print "ttt <a href="$links[$i]">$names[$i]</a> n<br>n";
, e/ M8 e7 ^5 _, ?  g9 g}
: |8 p2 C& H( @6 y8 {, j5 ^} . W/ H2 G: X) ~' b/ K; Y
?>
& O# s2 ^1 V" T% |, Z
0 m+ O* F2 {; B4 P: n; H& \* Z& ^这种方法使得程序看起来比较简洁,而且执行速度也较快。 ) ?1 H6 `6 u7 X0 U* C) I6 B

6 B& T( p( v: C1 V9 W( b/ a& D' \, N
2、使用模板的方法 ) e5 W$ e: ~0 A$ l2 v& R( V! Y
$ C& S* B3 N! h0 a
这种方法使得程序看起来更简洁,同样实现上面的功能,可用以下代码:
) y1 o0 K$ h+ t7 G( b<html>
) _7 }0 u0 ]; @0 J/ q. @' k) D<head> ; N& c. T' y" }6 b, U* B
<title>%%PAGE_TITLE%%</title> 6 u4 A4 {9 W6 y3 z( G
</head> 4 }3 |8 n  @6 Z& u( x4 u; u
<body %%BODY_PROPERTIES%%>
5 q% ]- m! A- `5 {) R* y; C<h1>%%PAGE_TITLE%%</h1> 4 X8 z: P2 S. i  p; C: e2 n
<table border="0" cellpadding="0" cellspacing="0">
& r& O- \0 W% j* M* Q* [2 t<tr>
2 m' V. X) {" v5 x<td width="25%">%%PAGE_LINKS%%</td>
- g% l3 B) g1 l- k. ~& Q/ ]<td>%%PAGE_CONTENT%%</td> / ~, S8 [0 k% Q( E
</tr>
8 d) ~' E+ j, x! o. ~</table>
/ h/ `5 I6 J, d4 U5 c6 d</body>
4 r& ]. n! `( k) X</html> ' S  B5 T8 Y$ B% z" C

3 ?- H! n. V4 s* A  用占位符代替要动态生成的内容,然后用一解析程序分析该模板文件,把占位符用际的内容替换。种方法使得即使不会使用PHP的页面制作人员也能修改模板文件。这种方法的缺点是执行效率不高,因为要解释模板文件。同时实现起来也比较复杂。 / n! M% r4 ^3 x/ P
# i6 b$ \* L3 e! j9 m" @
注: www.thewebmasters.net的 FastTemplate class可方便的实现以上功能。
' |. Y* B3 ^) G6 r- b$ C5 b" R7 D/ z4 J8 d0 Y
五、不要用过时的函数
; U/ F* j8 H/ s! S
0 t( }2 t2 @7 f4 P$ N作为一种自由软件,PHP发展很快,其中的很多函数都已过时,例如:
0 O. D) i  ^& F5 K* M
) S& G/ t- ~9 D/ r0 G- {  v! S% nwhile (1): , B  }* k7 v% u; B: u
print "5"; 0 r, c4 \* K' e1 `5 b, O8 V
if ($idx++ == 5): / ~; R. P" t# k( S9 l
break;
7 m. C+ t' C$ V6 o$ P, Lendif; 9 U2 ?: \9 t' `4 o0 C  @* d+ ^
endwhile; 9 @. P' J0 Y/ N8 U7 W

0 n2 ~  L0 J3 ~! I8 c6 ]  虽然还能用但效率肯定不高,而且可能在以后的版本中会禁用,导致程序不能运行。因此要经常对照最新PHP手册检查那些函数已过时及时修正。% J5 n! i: [6 B. N. K& i2 Y
+ J* [9 [1 V) }* e! R
You look down on me today, tomorrow I can't let you have been

精彩评论21

zuantanduila 发表于 2016-6-1 08:58:12 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
钻f探e 发表于 2016-6-7 07:39:36 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
登洲远 发表于 2016-6-25 17:31:28 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
汎阿青 发表于 2016-6-26 09:56:43 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
广翠宪 发表于 2016-6-26 12:00:18 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
珍妨莲 发表于 2016-6-27 07:24:39 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
棣枝广 发表于 2016-6-27 15:57:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
钻f探e 发表于 2016-6-30 01:19:41 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
arskg 发表于 2016-8-29 11:52:17 | 显示全部楼层
谢谢楼主啦~~~~+ j2 Q7 A, j1 b
$ @2 I0 }$ `' {! g! k. J4 W9 E/ k

6 e1 k1 N9 W8 g/ H( z4 H1 W# q- t6 N" L

7 [% @4 ?  Y. u# l- m; K8 f( K% ]2 k- j
) b# Q. c# e) o6 V

2 a% }5 f' O4 [4 H. Z. e' d1 E# F; T: e2 W$ A' `8 ]7 X" ]

5 a# w% |8 g, a. z4 I5 N* }" L# c6 _; `5 j" _) d  d9 t2 q5 Y4 g: R
& Q, t3 g# Z" g# I. R5 C1 b
php?mod=logging&action=login'+'&referer='+encodeURIComponent(location))" src="static/image/common/sigline.gif" border="0" alt="" />4 t( R4 c% h$ I, H
                               
php?mod=logging&action=login" onclick="showWindow('login', this.href+'&referer='+encodeURIComponent(location));">登录/注册后可看大图
& |' _- Y- p, m
24V4A电源适配器消费厂家

关注0

粉丝6

帖子3328

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

扫描微信二维码

关注华域联盟公众号

随时了解更新最新资讯

admin@cnhackhy.com

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

在线QQ客服

Powered by cnhackhy! © 2015-2019