gpt4 book ai didi

perl - 从命令行运行时,我们可以强制 perl 始终使用 open 的三个参数形式吗?

转载 作者:行者123 更新时间:2023-12-04 07:53:08 25 4
gpt4 key购买 nike

运行perl命令行中的单行具有 security implications .

问题是选项 -n/-p触发菱形算子<> , 它使用两个参数形式 open ,所以文件名包含特殊字符,perl没有按预期工作:

$ perl -pe '' 'uname|'
Linux

或者当文件名以 > 开头时更危险,如 >file .在这种情况下,文件将被截断。

为了解决这个问题,我们可以:
  • 使用ARGV::readonly来自 CPAN 的模块。
  • 实现 ARGV::readonly 等功能我们自己的模块:

  • perl -pe 'BEGIN{$_.="\0" for @ARGV} ...' ./*

  • 使用-i选项,如 perl将在处理之前检查文件是否存在。
  • 使用-T启用污点模式的选项。

  • 我认为所有解决方案都可以解决这个问题,但也有其副作用。如果我们可以强制 perl始终使用 open 的参数形式,这将是一个更好的解决方案。

    我想知道我们可以做到吗,力 perl始终使用 open 的参数形式?

    备注

    该问题仅适用于运行 perl 时的情况。来自命令行的一个衬里,因为(当然)我们总是可以使用 open 的三个参数形式在 Perl 脚本中。

    最佳答案

    您可能只想对单行执行此操作(使用 -e 开关),因此您需要自定义 ARGV::readonly为了这个目的。

    package Sanitize::ARGV;
    if ($0 eq '-e') {
    @ARGV = map { # from ARGV::readonly
    s/^(\s+)/.\/$1/;
    s/^/< /;
    $_.qq/\0/;
    } @ARGV;
    }
    1;

    要强制此包在系统范围内使用,您可以使用别名 Patrick J.S.建议
    alias perl='perl -MSanitize::ARGV'

    或设置系统范围的 PERL5OPT多变的
    PERL5OPT="-MSanitize::ARGV"

    如果您想更加偏执,请隐藏您的系统 perl(将其重命名为难以理解的名称)并用包装器替换它
    #!/bin/bash
    THE_REAL_PERL=/usr/bin/glorbqweroinuerqwer
    $THE_REAL_PERL -MSanitize::ARGV "$@"

    shell 包装器仍将尊重对 PERL5OPT 的任何用户自定义。

    在一般情况下,您可以使用 CORE::GLOBAL覆盖内置 open 的机制功能,例如
    package SafeOpen;
    use Carp;
    BEGIN {
    *CORE::GLOBAL::open = sub (*;$@) {
    goto &CORE::open if @_ > 2;
    Carp::cluck("OH MY GOD USING THE TWO-ARG open ARE YOU LIKE INSANE?");
    return CORE::open($_[0], '<', $_[1] // $_[0]);
    };
    }
    1;

    当这个模块被使用时,你会发现任何人在使用 2-arg open称呼。不幸的是,我认为 ARGV 的机制文件句柄魔术绕过了这一点,因此它仍然无法在单行中的命令行上处理愚蠢的文件名。

    关于perl - 从命令行运行时,我们可以强制 perl 始终使用 open 的三个参数形式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27198594/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com