当前位置:编程学习 > CGI >>

中文版 Perl CGI 程式写作常问问题集(五)

答案:Q4.6: 要如何用一个 Perl 的取代指令将所有 HTML
标签从一份文件中删除?

以下这个简单的 regular expression 可用来去除 HTML 标签*:

【译者】
1. 要让这个 regular expression 跨行执行,您必须先将您的
script 由预设的按行执行模式 (line mode) 改为按段执行模
式 (paragraph mode)。您可以在指令列以:

perl -00 -we '...'

的方式;或是在 script 中以:

#!/usr/bin/perl -00



$/ = "";

的方式来设定按段执行模式。
2. 除非您需要对欲删除的 HTML 标签中的内容做进一步的处理或
利用,否则本例中最外围的一对括弧可去掉。

$line =~ s/<(([^ >]|\n)*)>//g;

详细的相关资料,请看 Tom [Christiansen] 的 striphtml 程式

(<ftp://perl.com/perl/scripts/striphtml>,这个程式同时也收录在他的
tour of perl5 regexps
(<http://perl.com/perl/all_about/regexps.html>
讲义中。


----------------------------------------------------------------------

Q4.7: 要如何知道是谁/哪台机器/哪个浏览器执行了我的程式?

您可以从 HTTP_USER_AGENT 这个环境变数得知使用者所用的浏览器。

【摘自 WWW FAQ】

您的 CGI script
可以利用五个重要的环境变数来帮忙辨识使用者的身份。

* HTTP_FROM
这个环境变数理论上应设为使用者的email地址。但是许多浏览

器完全不加以设定【即不支援】,而大部份支援这个变数的浏览器又让使
用者自由设定这个值。因此,建议读者顶多拿它来做为 email form
中回
信地址的预设值。

* REMOTE_USER 这个变数唯有当 script
在安全认证的保护下执行时才会被
设定。从 AUTH_TYPE
这个变数可以知道所用的认证方法是属於哪一个类
型。REMOTE_USER
则会含有正接受认证的使用者的名字。要注意的是,
REMOTE_USER
只有在使用安全认证的时候才会被设定,而且不是所有的
servers 都支援。在 NCSA server
底下,如果认证所使用的传输方式没
有列入 access.conf 档中(也就是说,应使用 <Limit GET
POST>,而不是
仅仅用预设的 <Limit GET>),认证可能会出人意外地失败。

* REMOTE_IDENT 如果 server 能连接上客户端的 IDENT
server,它会将这
个变数设成远方使用者的身份。但由於向IDENT server
查询的动作太花
时间,大部份的 servers
都把这项功能关掉。更何况,客户端的机器是
否会回应查询,又是否会诚实以对,都是无法确定的。

* REMOTE_HOST
*
这个变数的设定值并不包括远端使用者的真实身份,但是会提供使用者正
用来连线的机器名称,只要 server
能找得出来。由於我们无法确切得知

使用者的真实身份【请看前一个环境变数的说明】,有的时候使用可确认
的位址来替代,不失为一个可行的变通方法。在 server
查不到远端的机
器名称,或者是为增加 server
的处理速度而将这个查询功能关掉的情况
下,这个变数是空的;请看底下 REMOTE_ADDRESS
一项的说明。还有,别
忘了您可能会发现所有使用同一个 proxy (代理人) server
的使用者的
机器名都变成了那台 proxy server 的名字。

* REMOTE_ADDR
这个变数的设定值并不包括远端使用者的真实身份,但是会
提供使用者正用来连线的机器的资料。REMOTE_ADDR 会包含客户端的
IP

位址,以用点隔开的十进位数字的形式来表示。由於我们无法确切得知使
用者的真实身份
[请看前一个环境变数的说明],有的时候使用可确认的
位址来替代,不失为一个可行的变通方法。和前一项 REMOTE_HOST
不同

的是,这个变数一定会被设定。还有,别忘了您可能会发现所有使用同一
个 proxy (代理人) server 的使用者的机器位址都变成了那台
proxy
server 的位址。

【摘录自 WWW FAQ 部份完】


----------------------------------------------------------------------

Q4.8: 人家看得到我的 Perl CGI
程式吗?如果是这样的话,那不就让他们知道
我的程式是怎麽运作的了。这是个安全漏洞吗?我要怎麽把它隐藏起来?

如果您将您的 server 设成对所有在一个特定目录(如
cgi-bin)下的档案,或
者是具有某些副档名(如 ``.pl''、``.tcl''、``.sh'')的档案一律都以
CGI
程式看待,那麽 server 只会执行这些程式。至於使用者是无法看到
script
本身的内容的。

但是如果您允许人们看您的 script (譬如把它放到 HTML
文件的根目录下),

那麽只要是这个程式没有安全上的漏洞,这并不能算是安全问题。如果这个程

式真的有安全上的破绽而您又允许使用者看这个程式,那麽他们便有机可乘,
进而利用这个弱点。

【译者】上面这段原文作者是就远方的客户端的使用者而言。和这个
主题相关的一 个常问问题是:

Q: 我的 Perl CGI scripts
必须将权限设为全世界可读。可是这样一
来,和我同
机器有帐户的人,只要知道我的程式名称,就可以浏览我
的 Perl 程式的内容;尤 其当其中牵涉到密码的问题时。

A: 至少有两个解决方法,一个简单,一个复杂:

简单的方法是,请您的系统管理者(如果不是您自己的话),将您的
CGI scripts 及密码档(如果您选择将密码存放在另一个档案中的
话)的所有者设成 Web server 跑的使用者(最常见的是使用者
nobody ;使用群 nogroup 或 nobody), 然後将 CGI scripts
的使
用权限设定成 550 (-r-xr-x---),密码档的权限设成 440
(-r--r-----)。如此一来,一方面您的程式得以执行,而且其他同机
器上的 使用者也没有办法偷看到您的程式和密码。

比较复杂的解决方法是先挑个难破的密码将整个程式加密起来,然後
再使用 Filter::decrypt 这个模组在临执行前将其解开,在此不多
说。有兴趣的读者请看 Filter::decrypt 的使用说明;此外新的
perl FAQ 第三部分中这一段:``How can I hide the source for
my
Perl program?'' ,大家也可参考。


----------------------------------------------------------------------

Q4.9: 我需要将整个 Perl library 都复制到我的 htdocs 目录底下吗?

不需要。您的 CGI scripts 可以使用 server
和文件根目录之外的任何档案,
除非 server 是在一个 chroot 的环境下执行。


----------------------------------------------------------------------

Q4.10:
我为什麽不该叫使用者输入他们的密码或身份证字号或信用卡号码?有
一个 TYPE="password" 不是就是拿来做这个的吗?

No! form 的介面中有一个 ``password''
的栏位,但是您不应该拿它来处理任
何机密性的资料。不该这麽做的原因是因为所有的 form 资料(包括
``password'' 栏) 都是以纯文字形式,而非以加密形式由浏览器送至
server。

如果您想要安全地传送资料,那麽您需要使用具有安全功能的
server,例如
Netscape 的 Commerce Server

(<http://home.netscape.com/comprod/products/iapps/platform.html>*。

【译者】Apache SSL ,例如 Stronghold 版
(<http://stronghold.c2.net>,同样具有这个功能。


----------------------------------------------------------------------

Q4.11: 我要如何产生专门替 Netscape
设计的网页,以别於世上其他的浏览
器?

您可以透过 HTTP_USER_AGENT 这个环境变数在您的 CGI script
中得知是否
Netscape 正在执行您的 script。以下为一例:

$browser = $ENV{'HTTP_USER_AGENT'};
if ($browser =~ /Mozilla/) {
#
# Netscape
#
} else {
#
# Non Netscape
#
}


----------------------------------------------------------------------

Q4.12: 为什麽我的 system() 所产生的资料输出顺序不对?


这是由於标准输出的产生方式通常是先累积相当的资料再输出(buffered)。要
让输出的资料以正确的顺序显示,您必须藉由 $| 这个变数的设定将
buffering
的特性关掉。


----------------------------------------------------------------------

Q4.13: 我听说 Netscape 会支援 Java*。这是不是说我现在得弃
Perl,改
Java 了?是不是该这麽做?

【译者】原 FAQ 已有相当一段时间未更新。这句话现在应该改作
「Netscape 和 IE 两大浏览器都已支援 Java」。

不、不、不。Java 和 CGI 的概念完全不同。CGI 是在 server
端执行,而
Java则是在 client 端执行。有些东西(如动画)可藉由使用 Java
而得到较好
的效果。但您可继续使用 perl 来发展 server 端的应用程式。

如果您需要有关 Java 进一步的资料,底下列了几个文件您可以去看看*:

* 升阳公司的 Java 文件 (<http://java.sun.com>
* Tom C.所写的 Java uber Alles(Java 的种种)
* Java, the Illusion(Java 幻像)

【译者】後面这两篇文章对 Java 及这个热潮作了很严厉的批判。本
FAQ 作者 Tom C. 的 Java uber Alles 中的论点主要著重於技术层
面。Tom 对 Java 的态度或许代表了不少 Perl 阵营人仕的心声。


----------

上一个:中文版 Perl CGI 程式写作常问问题集(四)
下一个:中文版 Perl CGI 程式写作常问问题集(六)

更多图片编程知识:
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,