vij*_*jay 8 perl shebang taint
我google了#!/usr/bin/perl
,但我找不到任何满意的答案.我知道这是一个非常基本的东西,但仍然可以解释我#!/usr/bin/perl
在Perl中有什么意义?此外,是什么-w
或-T
表示#!/usr/bin/perl
什么?我是Perl的新手,所以请耐心等待.
Ric*_*ton 14
#!通常被称为" shebang ",它告诉计算机如何运行脚本.您还会看到很多带有#!/bin/sh
或的shell脚本#!/bin/bash
.
那么,/usr/bin/perl
是你的Perl解释器,它运行并给出要执行的文件.
该行的其余部分是Perl的选项.该"-T"的玷污(这意味着输入被标记为"不信任",直到你检查它的格式)."-w"会发出警告.
您可以通过运行perldoc perlrun找到更多信息(perldoc是Perl的文档阅读器,可能已经安装,可能在自己的软件包中).
对于您编写的脚本,我建议您使用以下命令启动它
#!/usr/bin/perl
use warnings;
use strict;
Run Code Online (Sandbox Code Playgroud)
这会打开很多警告和额外的检查 - 在你学习的时候特别有用(我还在学习,现在我已经使用Perl超过10年了).
这两个-w
和-T
是一种"万无一失"的标志.
-w
与use warning
代码中的语句相同,并且它在许多编译器中等同于警告选项.最简单的例子是关于使用未初始化变量的警告:
#!/usr/bin/perl -w
print "$A\n";
print "Hello, world!\n";
Run Code Online (Sandbox Code Playgroud)
将打印:
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!
Run Code Online (Sandbox Code Playgroud)
该-T
标志表示来自外部世界的任何值(与在程序内部计算相反)被视为潜在威胁,并且不允许在与系统相关的操作中使用此类值,如写入文件,执行系统命令等.这就是当脚本在setuid/setgid下运行时Perl会激活"污点"模式的原因.)
"污点"模式是"强制"您仔细检查脚本中的值.
例如,代码:
#!/usr/bin/perl -T
$A = shift;
open FILE, ">$A";
print "$A\n";
close FILE;
Run Code Online (Sandbox Code Playgroud)
会产生致命错误(终止程序):
$ ./perl-tainted jkjk
Insecure dependency in open while running with -T switch at
./perl-tainted line 3.
Run Code Online (Sandbox Code Playgroud)
这只是因为论证价值来自"外部"并且不是"双重检查"."污点"模式引起了你对这一事实的关注.当然,很容易欺骗它,例如:
#!/usr/bin/perl -T
$A = shift;
$A = $1 if $A =~ /(^.*$)/;
open FILE, ">$A";
print "$A\n";
close FILE;
Run Code Online (Sandbox Code Playgroud)
在这种情况下一切正常.你"欺骗"了"污点模式".好吧,假设是程序员的意图是使程序更安全,所以程序员不仅会解决错误,而宁愿采取一些安全措施.Perl的昵称之一是"胶水和系统管理员的胶带".系统管理员不是不可能为自己的需要创建Perl脚本,而是使用root
权限运行它.想想这个脚本正在做普通用户不允许做的事情......你可能想要仔细检查不属于程序本身的东西,并且你希望Perl提醒你它们.
希望能帮助到你.