系统讲解 Perl 安全开发实践,帮助识别并修复常见代码与Web安全风险。
该技能材料看起来是面向 Perl 安全开发的提示与文档,未声明需要密钥、远程端点或本地执行能力,整体风险较低。主要需留意的是来源元数据与技能名称/仓库对应关系不够清晰,许可证与维护状态也未明确。
材料明确标注无需密钥或环境变量;README 也未要求接入第三方账户、API token 或数据库凭证,未见凭证收集、存储或滥用路径。
未声明任何远程端点,且该技能被标记为 prompt-only;文档内容主要是安全编码指南,没有显示会把用户数据发送到外部服务。
作为纯提示/文档型技能,材料未描述会在本机启动进程、执行脚本或调用系统能力。README 中涉及 system commands 仅为 Perl 安全实践说明,不代表该技能自身执行代码。
未声明具备读写本地文件、数据库或其他资源的实际权限;文档虽讨论文件操作与输入验证,但属于教学内容,不体现真实数据访问范围。
有 GitHub 开源来源且社区采用度很高,这些都是明显的降风险因素;但仓库链接为 affaan-m/ECC,与技能名“perl-security”对应关系不够清晰,且许可证未声明、维护状态未知,因此供应链维度建议保留留意。
复制安装指令,让 AI 自动完成配置 · 推荐新手
请帮我安装 askskill 上的 "perl-security" 技能: 1. 下载 https://raw.githubusercontent.com/affaan-m/ECC/main/skills/perl-security/SKILL.md 2. 保存为 ~/.claude/skills/perl-security/SKILL.md 3. 装好后重载技能,告诉我可以用了
请审查这段 Perl 代码的安全风险,重点检查 taint mode、输入验证、命令执行、SQL 注入和 XSS 问题,并给出修复建议与示例代码。
一份按风险分类的安全审查结果,包含漏洞说明、风险等级和修复后的 Perl 示例。
我在 Perl 中使用 DBI 访问数据库,请把下面的拼接 SQL 改写为参数化查询,并说明这样如何降低 SQL 注入风险。
参数化 DBI 查询示例,以及输入处理和数据库安全实践说明。
请基于 Perl 安全最佳实践,生成一个团队可用的安全编码清单,涵盖 taint mode、文件与进程操作、Web 安全、依赖审查和 perlcritic 安全策略。
一份结构化的 Perl 安全编码清单,可用于代码评审和开发规范落地。
Comprehensive security guidelines for Perl applications covering input validation, injection prevention, and secure coding practices.
Start with taint-aware input boundaries, then move outward: validate and untaint inputs, keep filesystem and process execution constrained, and use parameterized DBI queries everywhere. The examples below show the safe defaults this skill expects you to apply before shipping Perl code that touches user input, the shell, or the network.
Perl's taint mode (-T) tracks data from external sources and prevents it from being used in unsafe operations without explicit validation.
#!/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._-]+)$}) {
return $1;
}
die "Invalid filename: contains unsafe characters\n";
}
# Bad: Overly permissive untainting (defeats the purpose)
sub bad_untaint($input) {
$input =~ /^(.*)$/s;
return $1; # Accepts ANYTHING — pointless
}
use v5.36;
# Good: Allowlist — define exactly what's permitted
sub validate_sort_field($field) {
my %allowed = map { $_ => 1 } qw(name email created_at updated_at);
die "Invalid sort field: $field\n" unless $allowed{$field};
return $field;
}
# Good: Validate with specific patterns
sub validate_email($email) {
if ($email =~ /^([a-zA-Z0-9._%+-]+\@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})$/) {
return $1;
}
die "Invalid email address\n";
}
sub validate_integer($input) {
if ($input =~ /^(-?\d{1,10})$/) {
return $1 + 0; # Coerce to number
}
die "Invalid integer\n";
}
# Bad: Blocklist — always incomplete
sub bad_validate($input) {
die "Invalid" if $input =~ /[<>"';&|]/; # Misses encoded attacks
return $input;
}
use v5.36;
sub validate_comment($text) {
die "Comment is required\n" unless length($text) > 0;
die "Comment exceeds 10000 chars\n" if length($text) > 10_000;
return $text;
}
Catastrophic backtracking occurs with nested quantifiers on overlapping patterns.
use v5.36;
# Bad: Vulnerable to ReDoS (exponential backtracking)
my $bad_re = qr/^(a+)+$/; # Nested quantifiers
my $bad_re2 = qr/^([a-zA-Z]+)*$/; # Nested quantifiers on class
my $bad_re3 = qr/^(.*?,){10,}$/; # Repeated greedy/lazy combo
# Good: Rewrite without nesting
my $good_re = qr/^a+$/; # Single quantifier
my $good_re2 = qr/^[a-zA-Z]+$/; # Single quantifier on class
# Good: Use possessive quantifiers or atomic groups to prevent backtracking
my $safe_re = qr/^[a-zA-Z]++$/; # Possessive (5.10+)
my $safe_re2 = qr/^(?>a+)$/; # Atomic group
# Good: Enforce timeout on untrusted patterns
use POSIX qw(alarm);
sub safe_match($string, $pattern, $timeout = 2) {
…
为 Quarkus 项目执行发布前验证闭环,涵盖构建、测试、扫描与差异审查。
帮助开发者落实 Laravel 安全最佳实践,覆盖认证授权、常见漏洞防护与安全部署。