# _4 `+ {9 `+ L6 X( n* V4 J2 i z12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选): K' Q8 h$ Z0 B
0 f) t6 a, Y( X7 X9 ^' a+ `A.使用GET方式传值 ' U6 ?7 K4 O$ @( iB.用htmlentities()处理电子邮件地址! `: m' K# s& t/ u3 A) }( U
C.使用POST方式传值7 Q% U* y' l3 f W$ x
D.用htmlentities()处理邮件正文 5 Q5 m* u. z) j: T3 [E.确保填写邮件地址的文本域不能有换行符% o2 M* X @' [8 z
6 k8 u' }0 u$ t V5 n- I$ [% c9 p9 B6 o* Y5 k" ?6 Z: n. O
13.如何将一个数组作为附件发送,并要能在接收后重新组合?5 I& p0 @& R4 \- p6 |
* L W0 m6 \ U6 k2 A
A.用serialize()把它转换成字符串,再用htmlentities()处理一下 + M! d- w( Y- ]. w& h+ cB.把它存在文件中,并用base64_encode()进行编码$ O, p ? w# ^, _, y w
C.用serialize()把它转换成数组5 p9 z9 Q Z) c! [
D.用serialize()把它转换成数组,再用base64_encode()进行编码 $ i; }- F2 o3 x; B; L6 vE.把它存在文件中,再用convert_uuencode()进行编码" }& M6 e4 }8 k, W9 t" o3 P+ k
: ~1 X# g: f6 {% |0 G' _! `
! { q/ H5 D+ n- M8 z& `14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?7 y! E Y. e$ C9 |" r) {6 Q
z `( x. U* ~& ?% _3 i" b7 j0 AA.堆一个检测脚本出来 : ?' q; D2 L6 ~ m& vB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型: }( j) w) }1 y, j
C.写一个识别文件MIME类型与内容是否相符的函数" W; s( k6 \) w
D.使用mime_content_type函数 / v' u) v+ |6 B) r1 dE.把文件上传到外部服务器上' u. I' i6 d9 U
% |( ~/ Y8 `6 j0 [7 N1 V/ E
7 h6 W$ H2 t1 R0 n
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选) 3 B6 ~! K/ W, g6 A 6 y1 V0 l& ?1 y$ @A.添加一个From头信息' y2 G# c4 ]" ~+ ~+ w
B.使用-f参数& J0 r, S: Z8 U2 [1 c" T
C.添加一个Reply-to的头信息 3 ?2 [* A2 |) A; a) j& v5 iD.确保运行Apache的用户有修改sendmail设置的权利; A0 \+ ?! U& G1 \3 [
E.确保Apache在root用户下运行; R/ e7 L- k6 R" Z* t; @3 F
答案速查. ~$ W) k' ^ o5 Q3 n+ \9 D
1:D " ]* t! [( Y- L* S2:AD 7 \* D/ X. }: `: j7 q3:E 6 D# S' ~8 w' p2 ^) L7 t; w4:Content-Type:MIME $ B$ g# u9 A; _( N5 _& @( b2 j5:BC3 {$ B: |, {* P+ R7 {" }
6:A 4 Y7 g& B) h) a3 M3 o7:C8 }- U) c4 g2 N( J9 Z7 s
8:BCE ( D, v4 b' I8 K( [( ^+ K& b: _9:ACD4 G+ B: ]% v: R4 r( [" p: T
10:B& X$ N5 t) G" c9 N( _, j
11:D 5 R- K i+ ^, a+ u; V12:CE% x; r2 w3 E3 ] L, K) z. M
13:D9 s8 T9 K% w# P
14:D ; v) h/ }6 l/ J! `15:ABD6 u2 x" ^9 H. ~2 ~6 ^, e/ }
0 t2 |; Z. t% m) p0 D+ I0 B* j1 h0 @( c: i
0 ~+ R1 ]: M' R' _& A答案详解0 g$ t8 b/ p+ G" z0 V
6 r9 s0 T3 Z/ J% ^$ U0 i1 o/ j
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。 % v# y: w, D3 \+ C9 W7 J1 b5 C# Y
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。3 q! i, j! b/ F
$ E; k5 ]- _- A% n! o) ~* M3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。 / u; ^, f _! l$ p, G, t" i5 C8 P3 q/ \( ?
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。 8 s* M+ R! A, N& J( x9 P; g* [9 p! |+ |' L
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。 1 H" ]+ ~2 r" t5 u; i2 F: l4 \6 R + @ j" U: [* K; b% Y6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。5 Q6 H: q" }- X2 g: ]* a
2 a" ]1 t! o z) H' l
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。# `5 w7 W8 ~+ n0 Y. F) O- B
2 c( I+ W5 ]0 b& C8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。 " _& ~. `. z& a2 x7 E) ~" t1 s- l/ s# _8 G' c: H& Q
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。" q+ W$ z9 y6 z& f- |3 \3 d
4 p2 c) R0 X" n `( R( w8 V, t ?# |
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。% I# |5 ~9 ~0 g+ X1 n2 S
6 l8 v/ J3 Q2 w, x# L7 I
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。 % J: ]7 I" _3 N# X/ e& @) r$ y3 H1 O; V$ N7 G 3 M: }, u, B; c( M# ?8 C7 f" ~- H12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。) A$ r! k- f6 j* C- ~; s: H
; k4 `( v' W( i `* F& C
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。: r/ O2 K* ?' T b& i
1 z9 \+ x! b$ g/ @14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。1 e( ^$ J. L/ o) M" b) D* W g
" k O. ]" r8 ?) u5 N3 ^! k/ h
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。