[Zend权威认证试题讲解]第十一章 - 编写安全的PHP程序
PHP太强大、太容易了,因此开发者常常忘记Web安全相关的问题。抛开重要性不看,安全问题往往是网站中最容易被人忽视的一个部分。不幸的是,有很多种方法可以从内部或外部危害系统的安全,你必须不断的找出并修补这些潜在的危险因素。{b Y-`:[+A:W@\
在进行安全检测时,有很多需要强调的问题——不止是与安全直接相关的,还包括许多其他的内容。}\!T@!q'P
要编写安全的程序,首先必须掌握一些基础技术,这样你才能应付本章的题目。-[*[.jCq/ta t2A
w@C)SI!x
gt8nV~"^w9xy\9P
问题+{-mp?f3CA
1.以下哪种方法能防止你的PHP程序遭受外部入侵?
A.使用复杂的加密算法"YL$QR c,\
B.保护数据库密码
C.如果有可能的话,使用SSL vG)s.rn
D.验证输入-Vm_r/C#Z#i7` h.A
E.只使用来源可信的输入u9v"eU8j[yi })T
;W(LE[,l~&E0b
2.假设$action和$data变量用来接受用户输入,并且register_globals是打开的。以下代码是否安全?[code] pM'\ JM3]3E
<?php.m FF k(H
if(isUserAdmin()) { $isAdmin = true; }
$data = validate_and_return_input($data);/qE.C\ kj
switch($action)#MA1G2i;CGIjWc
{
case 'add':
addSomething($data);
break;'U pw&SOD
case 'delete':
if($isAdmin) {
deleteSomething($data);
}
break;
case 'edit':PV d-yg[(um Rb
if($isAdmin) {|(Mq.k1LTW9nm
editSomething($data);
}%K'v7v]-~(|
break;
default:
print "Bad Action.";
}1f\!Z^_-LW${#}
?>
[/code]A.安全。在执行受保护的操作前先检查$isAdmin是否为true
B.不安全。没有确认$action是不是合法输入
C.不安全。$isAdmin可以通过register_globals被篡改
D.安全。因为它验证了用户数据$data
E.A和B
6g'Gp+lm$A
E{+u*Zf]1|!`A \3p
3.要防止跨站攻击,以下哪些是需要做的?(三选)
J{&vu(fr
A.永远不要使用include和require引入靠用户输入决定路径的文件(比如:include”$username/script.txt”;) U.I*hyI*h
B.除非网站需要,否则关闭allow_url_fopen
C.避免使用如curl这类用来打开远程连接的扩展库+cph+O"X8W4s6s
D.使用类似strip_tags()一类的函数过滤一个用户输入给另一个用户看的内容
E.以上都对{0IL,Xy%zH:a7T(A
0]"Sw!dO4|.Kt
;O+P|f;O
4.如果register_globals必须要被打开,如何才能防止恶意用户危害系统安全?(双选)y3C!v%f#G2W"b
A.过滤所有来自非信任源的数据?G:St M1ww0F\T
B.过滤所有外部数据
C.所有变量在使用前先初始化0W&Jx"k im,D]Kx
D.使用难猜变量名来防止用户篡改数据
E.以上都对
]'o*K@1N*beL
5.SQL查询常常基于用户输入的数据来构建。以下哪种方法能避免安全隐患?
\e2T k7h
A.在数据服务器和web服务器之间放置防火墙
B.转义用户数据,使其中无法包含DBMS能执行的SQL命令e E?9P"^/L;m @ i
C.使用存储例程8G4WMh-\,E*q d
D.使用面向对象编程,把每个查询定义为单独的类(OKQ'T!\w ynw
1UkQHy4m
6.某些时候需要在PHP脚本中使用第三方功能,来实现一些PHP不能完成的任务(比如调用压缩软件压缩某种PHP不支持其格式的文件)。在PHP脚本中执行系统命令时,以下哪些选项能确保没有命令注入?(双选)
A.总是给要在exec()中执行的命令加`
B.总是使用shell_exec函数,它能够在执行前对命令进行安全检查
C.使用escapeshellcmd函数转义命令中的特殊字符gr{T__v%Z
D.在执行命令前,先用ini_set()打开safe_mode,
E.用escapeshellarg函数在执行前转义命令参数3m `7C6l:a?*UG
9h?@V@5ZI H
7.处理HTTP文件上传时,PHP把文件储存在$_FILES中。在PHP脚本的执行周期中,这些文件将放在本地的临时文件夹里,而在脚本结束后,文件将被自动删除。在处理HTTP文件上传时,如果确保当前操作的文件是正确的文件?(双选)/sH N%p8r P!LG
7_oGDX$F] g*}
A.操作前,将文件名与浏览器报告的文件名对比3`p {JR5Ce
B.操作前,用file_exists函数确保文件存在
C.用is_uploaded_file函数确认你的文件的确是通过HTTP方式传输过来的
D.用move_upload_file()将文件移动到安全位置?wM{X%aB
E.只信任PHP存储临时文件的目录下的文件3D!M@(BWl? jmo
H,?m3A6iq K
8.在PHP的“安全模式”下,以下哪些设置有助于降低安全风险?(三选)
A.限制shell命令的执行^fk'd8qb5n
B.限制对系统环境变量的访问
C.限制PHP的文件包含目录
D.限制允许对数据库进行的操作/HfD*P2i"}-eU
E.以上全部mf^$t.}.s#K2|
9.要限制脚本只能访问一个指定的文件夹中的文件,以下那种方法最简单?6U)c^+MP4Gy,L
A.打开safe_mode
B.用open_basedir指定允许的文件夹,F7w6Q|JF&z%J _?
C.用自定义函数指定PHP可以访问的目录`xkcE}M!X
D.设置文件系统权限,让PHP只能访问允许的目录
E.以上都不对,无法限制PHP的访问目录
10.上传文件时,能否确保客户端浏览器不会上传大于指定容量的文件?| PR0~+N
A.能`&tY^-}
B.不能0u M4w&d%r9gaj#D
11.你的PHP以CGI的形式运行在Linux+Apache系统的cgi-bin文件夹中。如果有人打开以下URL将发生什么?S/h$^+Ll-h:Vu
){&DWK }*~V#r
/cgi-bin/php?/etc/passwd-U4Z9\XZ:Q)G
A./etc/passwd目录下的文件都会被显示出来,造成安全隐患pr.ZGD&a\$rr%M
B.操作系统会检查Apache是否允许打开/etc/passwd目录7E;w1BM)QXAg`
C./etc/passwd字符串作为参数传给了脚本
D.什么都不会发生。CGI模式下的PHP将自动拒绝此次访问E#v2B`f
E.PHP尝试把/etc/passwd作为PHP脚本进行解释
{)M.l vZvp&d
12.尽管并不彻底,但以下哪些方法能识别并防范代码中的安全隐患?(选择最合适的答案)Fh*f*[S\'}k
A.查阅PHP手册中提到的安全隐患f3heC5|!m;]"y
B.任何脚本执行失败的情况都写入日志
C.保持更新最新的PHP版本,尤其是解决了安全问题的那些$hqk2k'tWjO
D.使用第三方PHP包时,了解并修正其中的安全问题u6r(x(R R H
E.以上都对