[Zend权威认证试题讲解]第十一章 - 编写安全的PHP程序
PHP太强大、太容易了,因此开发者常常忘记Web安全相关的问题。抛开重要性不看,安全问题往往是网站中最容易被人忽视的一个部分。不幸的是,有很多种方法可以从内部或外部危害系统的安全,你必须不断的找出并修补这些潜在的危险因素。8QI*u\lLu}F
在进行安全检测时,有很多需要强调的问题——不止是与安全直接相关的,还包括许多其他的内容。
要编写安全的程序,首先必须掌握一些基础技术,这样你才能应付本章的题目。
1{}7F(oI&pC$L
问题b EZ#P|4?G^U
b$G @"|%C'a
1.以下哪种方法能防止你的PHP程序遭受外部入侵?P pj"]*||(S\
6[j.a h(D(t&_~-hf
A.使用复杂的加密算法
B.保护数据库密码e#w ^;f&e1K fi/H
C.如果有可能的话,使用SSLD`(P3tN/S||
D.验证输入
E.只使用来源可信的输入
2.假设$action和$data变量用来接受用户输入,并且register_globals是打开的。以下代码是否安全?[code]
<?phpV&k"Pia I8e
if(isUserAdmin()) { $isAdmin = true; }
$data = validate_and_return_input($data);
switch($action)N0wd e/i0?yH
{
case 'add':
addSomething($data);
break;%M"PqDWZ y]S
case 'delete':
if($isAdmin) {nt h_&v
deleteSomething($data);#AHJv R:K(}x0^Z;vM
} xX0o~ S']!Kd
break; L(C*FQCI d6]&nS
case 'edit':
if($isAdmin) {2M Q[]bJJ+Lm4R
editSomething($data);vj&t_QX`C"^e
}
break;!q2_F!d)Ln3H8q4J#h
default:OG6_of @)~[R`
print "Bad Action.";
}Ay$XP9Fev.i{
?>D]3r G,o|Wf^
[/code]A.安全。在执行受保护的操作前先检查$isAdmin是否为true;x'_j#nT
B.不安全。没有确认$action是不是合法输入-Z#Q0GRW
C.不安全。$isAdmin可以通过register_globals被篡改
D.安全。因为它验证了用户数据$data2tk1W(Q6[|Kw
E.A和B:AF8LP%w7Q"l"iR
3.要防止跨站攻击,以下哪些是需要做的?(三选)u%`Csh[6z
A.永远不要使用include和require引入靠用户输入决定路径的文件(比如:include”$username/script.txt”;)3`Ks Aiu?h.z
B.除非网站需要,否则关闭allow_url_fopen
C.避免使用如curl这类用来打开远程连接的扩展库
D.使用类似strip_tags()一类的函数过滤一个用户输入给另一个用户看的内容
E.以上都对
4.如果register_globals必须要被打开,如何才能防止恶意用户危害系统安全?(双选)%l)?)],m6O!G)O.f\
Sf/\!s3y R g
A.过滤所有来自非信任源的数据$@_{;l1Ep)h.s8@ e
B.过滤所有外部数据
C.所有变量在使用前先初始化
D.使用难猜变量名来防止用户篡改数据
E.以上都对
R M6R fV#cV.S,?3P
iD-] |,H}'w
5.SQL查询常常基于用户输入的数据来构建。以下哪种方法能避免安全隐患?3yuSe B P{
rzJO i]$d.~#F+Y*{
A.在数据服务器和web服务器之间放置防火墙9S2M/{U"_K&K-y
B.转义用户数据,使其中无法包含DBMS能执行的SQL命令m F&uj-g q
C.使用存储例程
D.使用面向对象编程,把每个查询定义为单独的类
|^nE&sQr?4D
6.某些时候需要在PHP脚本中使用第三方功能,来实现一些PHP不能完成的任务(比如调用压缩软件压缩某种PHP不支持其格式的文件)。在PHP脚本中执行系统命令时,以下哪些选项能确保没有命令注入?(双选)