-w 和 -T 都是“万无一失”的标志。
-w 与代码中的use warning 语句相同,在许多编译器中它相当于警告选项。一个最简单的例子是关于使用未初始化变量的警告:
#!/usr/bin/perl -w
print "$A\n";
print "Hello, world!\n";
将打印:
Name "main::A" used only once: possible typo at ./perl-warnings line 3.
Use of uninitialized value $A in concatenation (.) or string at
./perl-warnings line 3.
Hello, world!
-T 标志表示任何来自外部世界的值(与在程序内部计算相反)都被视为潜在威胁,并且不允许在与系统相关的操作中使用这些值,例如写入文件、执行系统命令等(这就是为什么当脚本在 setuid/setgid 下运行时 Perl 会激活“污点”模式。)
“污染”模式是“强制”您仔细检查脚本中的值。
例如,代码:
#!/usr/bin/perl -T
$A = shift;
open FILE, ">$A";
print "$A\n";
close FILE;
会产生致命错误(终止程序):
$ ./perl-tainted jkjk
Insecure dependency in open while running with -T switch at
./perl-tainted line 3.
那只是因为参数值来自“外部”并且没有“双重检查”。 “污点”模式正在引起您对这一事实的注意。当然,很容易被骗,例如:
#!/usr/bin/perl -T
$A = shift;
$A = $1 if $A =~ /(^.*$)/;
open FILE, ">$A";
print "$A\n";
close FILE;
在这种情况下,一切正常。你“愚弄”了“污点模式”。好吧,假设是程序员的意图是使程序更安全,因此程序员不会只是解决错误,而是会采取一些安全措施。 Perl 的绰号之一是“系统管理员的粘合剂和胶带”。系统管理员不太可能会根据自己的需要创建 Perl 脚本并使用root 权限运行它。想象一下这个脚本做了一些普通用户不允许做的事情……您可能想要仔细检查不属于程序本身的事情,并且希望 Perl 提醒您这些事情。
希望对你有帮助。