如何在一个带有“#!/usr/bin/env perl”shebang的perl脚本中设置污点模式?

11

如何在Perl脚本中设置污点模式?

#!/usr/bin/env perl

什么是 shebang?


2
如果您无法预测perl二进制文件的位置(/usr/bin或/usr/local/bin),那么这将非常有帮助。http://www.perlmonks.org/?node_id=716740 - 我想问题是您是否可以预测env的位置... - Gavin Brock
3
在我的个人电脑上,我使用/usr/local/bin/perl,在我的小型笔记本电脑上则使用/usr/bin/perl。因此,使用/usr/bin/env perl命令,我无需更改perl脚本。我猜想下一个操作系统版本将默认安装perl 5.10.1版本,所以也许我会在我的个人电脑上再次使用内置的/usr/bin/perl,并且也不需要更改shebangs(脚本中的#!行)。 - sid_com
Gavin,env 的位置是标准化的。 - daxim
@daxim 除非你使用OpenServer 5.0.6(SCO)或Unicos 9.0.2(Cray);-) http://en.wikipedia.org/wiki/Hash-bang#Portability - Gavin Brock
1
@Sinan,如果你曾经使用过perlbrew并在系统上安装了多个Perl版本,则使用/usr/bin/env perl是一个救星。 - mpeters
2个回答

12
你可以在 shebang 行上传递 PERL5OPT 环境变量:
#!/usr/bin/env PERL5OPT=-T perl

这对我来说似乎有些不合逻辑。

另一个选项是,如果您检测到脚本未开启污点模式,则重新在污点模式下执行该脚本:

#!/usr/bin/env perl

warn 'Taint mode is '.(${^TAINT} ? 'on' : 'off'); # For debugging

exec($^X,'-T',$0,@ARGV) unless ${^TAINT};

# do stuff under taint mode here

显然,这会极大地影响启动性能。

3
在 shebang 中使用 /usr/bin/env 无法指定变量。这样做会导致 env 在一个无限循环中执行自己,甚至没有执行所请求的命令。我在 Linux 和 FreeBSD 上都进行了测试。 - Zed
1
是的 - 目前似乎只有OS-X支持第一种变化。 - Gavin Brock

3

由于污点模式只能通过-T标志启用,并且在shebang行中env不接受任何标志,因此您最好通过perl -T script.pl运行程序,而不是直接执行脚本。

如果您绝对需要在shebang中强制执行污点模式,则可以在PATH的某个位置(例如/usr/local/bin)创建一个具有以下内容的taintperl脚本:

#!/bin/sh
/usr/bin/env perl -T

在您的Perl脚本中,需要这样写:
#!/usr/bin/env taintperl

在许多操作系统中,您不能使用解释脚本作为脚本解释器。您需要使用编译语言来完成此操作,例如C语言。 - Gavin Brock
2
@GavinBrock 这对于紧接着 #! 后面提到的程序是正确的。在这里,它是 /usr/bin/env,已经编译过了。反过来,env 不关心 taintperl 是否是一个编译过的程序。 - maxelost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接