Perl 安全模式
涵盖输入验证、注入预防和安全编码实践的 Perl 应用程序全面安全指南。
何时启用
- 处理 Perl 应用程序中的用户输入时
- 构建 Perl Web 应用程序时(CGI、Mojolicious、Dancer2、Catalyst)
- 审查 Perl 代码中的安全漏洞时
- 使用用户提供的路径执行文件操作时
- 从 Perl 执行系统命令时
- 编写 DBI 数据库查询时
工作原理
从污染感知的输入边界开始,然后向外扩展:验证并净化输入,保持文件系统和进程执行受限,并处处使用参数化的 DBI 查询。下面的示例展示了在交付涉及用户输入、shell 或网络的 Perl 代码之前,此技能期望您应用的安全默认做法。
污染模式
Perl 的污染模式(-T)跟踪来自外部源的数据,并防止其在未经明确验证的情况下用于不安全操作。
启用污染模式
#!/usr/bin/perl -T
use v5.36;
# Tainted: anything from outside the program
my $input = $ARGV[0]; # Tainted
my $env_path = $ENV{PATH}; # Tainted
my $form = <STDIN>; # Tainted
my $query = $ENV{QUERY_STRING}; # Tainted
# Sanitize PATH early (required in taint mode)
$ENV{PATH} = '/usr/local/bin:/usr/bin:/bin';
delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};
净化模式
use v5.36;
# Good: Validate and untaint with a specific regex
sub untaint_username($input) {
if ($input =~ /^([a-zA-Z0-9_]{3,30})$/) {
return $1; # $1 is untainted
}
die "Invalid username: must be 3-30 alphanumeric characters\n";
}
# Good: Validate and untaint a file path
sub untaint_filename($input) {
if ($input =~ m{^([a-zA-Z0-9._-]+)$}) {
r…