PHP太强大、太容易了,因此开发者常常忘记Web安全相关的问题。( P; B! {6 C4 ~* h& \6 r( t4 |) r7 V
抛开重要性不看,安全问题往往是网站中最容易被人忽视的一个部分。不幸的是,有很多种方法可以从内部或外部危害系统的安全,你必须不断的找出并修补这些潜在的危险因素。+ n8 x. x0 G, X! P6 i+ V
在进行安全检测时,有很多需要强调的问题——不止是与安全直接相关的,还包括许多其他的内容。 3 Q/ |$ o5 _# X3 Z" d要编写安全的程序,首先必须掌握一些基础技术,这样你才能应付本章的题目。2 e( Y$ L/ g" D' ?3 C1 j. c& ]1 D
1 q% M7 K4 T& x& x
& ]/ p8 W% P$ }
问题, g3 [& K: D S
6 }+ d. p: e' d$ `1.以下哪种方法能防止你的PHP程序遭受外部入侵? J0 X2 p! ], f5 j4 s) _& Q1 [ B& z9 U. q* s' z( B
A.使用复杂的加密算法 v" Y* x5 ^: _: \9 x8 \B.保护数据库密码+ M7 n, ~+ d2 A4 w
C.如果有可能的话,使用SSL 6 {& g i1 r, g# J; P0 J! ~D.验证输入 ' d. O. ]5 G" l: _6 ME.只使用来源可信的输入 # O, B6 V, a. `9 Q* A - `3 y6 k N5 F0 C: _+ m 2 Y9 Y: a/ X7 j; e7 R2.假设$action和$data变量用来接受用户输入,并且register_globals是打开的。以下代码是否安全?
<?php
if(isUserAdmin()) { $isAdmin = true; }
$data = validate_and_return_input($data);
switch($action)
{
case 'add':
addSomething($data);
break;
case 'delete':
if($isAdmin) {
deleteSomething($data);
}
break;
case 'edit':
if($isAdmin) {
editSomething($data);
}
break;
default:
print "Bad Action.";
}
?>
复制代码
A.安全。在执行受保护的操作前先检查$isAdmin是否为true! v1 J' i* O0 h3 O
B.不安全。没有确认$action是不是合法输入' M0 G; Y W$ G y" u$ Y1 N+ K
C.不安全。$isAdmin可以通过register_globals被篡改 ( r) @; r X9 HD.安全。因为它验证了用户数据$data 0 ]" K& O3 D' J. [" QE.A和B% F5 p, o x" K+ E
4 ]1 x- m6 J8 R7 \5 t
. x$ m, D& f. y1 q! K7 yA.打开safe_mode / p7 e& @0 S0 ~2 m- s7 XB.用open_basedir指定允许的文件夹 ) q* O. o" n' | A/ @( U+ zC.用自定义函数指定PHP可以访问的目录 $ c2 K7 [2 Y- Z# \# Q* `# DD.设置文件系统权限,让PHP只能访问允许的目录* ~- n, C1 i, p/ ~" I
E.以上都不对,无法限制PHP的访问目录 : B! b2 V+ X( N! V9 f/ _6 }2 a7 `$ x q
0 m$ E2 _& E u8 x2 x9 ]10.上传文件时,能否确保客户端浏览器不会上传大于指定容量的文件?$ F5 F8 w* Q( X/ ~" z# ?8 s
+ ^. X5 t- F! W+ Z8 dA.能 " W- B4 @: a* k/ q9 B8 fB.不能1 X# l8 x4 _/ a1 h. X
8 Y0 P m) ~ y9 q0 \4 L4 R
& H4 S" H5 u) [$ X _ M11.你的PHP以CGI的形式运行在Linux+Apache系统的cgi-bin文件夹中。如果有人打开以下URL将发生什么?$ T2 q. I+ T ^1 O" r
- Y. J+ r0 y! m+ z+ I
/cgi-bin/php?/etc/passwd8 E: ]0 I" t& K: o' n7 G
2 x f6 q3 ~3 E. Y1 Z
A./etc/passwd目录下的文件都会被显示出来,造成安全隐患 7 l$ z% G. b {/ }( U% }# qB.操作系统会检查Apache是否允许打开/etc/passwd目录 / W3 G. l. O( M. kC./etc/passwd字符串作为参数传给了脚本3 c! C7 L% J' a! m
D.什么都不会发生。CGI模式下的PHP将自动拒绝此次访问# g# d f6 |& E# c* X) a: Z
E.PHP尝试把/etc/passwd作为PHP脚本进行解释% x/ C U- J# k. d6 E0 b' ]1 N
$ t% y" }8 a) h; d; \
" W# g0 W* l) i& O5 k12.尽管并不彻底,但以下哪些方法能识别并防范代码中的安全隐患?(选择最合适的答案)! i7 G1 f' I* R6 v
A.查阅PHP手册中提到的安全隐患/ n+ `3 r! W' t0 v7 x
B.任何脚本执行失败的情况都写入日志 7 S2 ^$ o- s8 a6 QC.保持更新最新的PHP版本,尤其是解决了安全问题的那些 # z% r. _& |" w; g& Y( vD.使用第三方PHP包时,了解并修正其中的安全问题 _2 ^ G# g, \$ c0 [$ O
E.以上都对! @% ]5 V# A9 E
# v& O: p0 ]; i+ n
4 C0 t4 b% l$ H. q: b13.当网站发生错误时,该如何处理?* h1 a* o, [3 t