2014-04-30 54 views
1

我根本不知道perl,但我需要更改退出程序以提供更清晰的调试输出。Perl安全性,打印声明?

这是结:

print $lfh "$ts\t$tid\t$msg\n";

其中$味精会被加入函数的参数是这样被创建:在$味精

my $msg = join("\t", @_);

某处,我想在调用程序时添加用户提供的命令行参数之一。如果打印到标准输出,是否存在利用漏洞的风险?

open my $lfh, ">>", $ENV{GL_LOGFILE}

的信息,我可以:

还要注意$ LFH将来自环境变量的采取,如果它是写一个文件,就像这样(通过脚本本身早些时候设定) perl安全上找不到关于打印声明,所以也许我只是完全偏执狂,但比对不起更安全...

+0

环境可以视为用户输入,所以它需要某种消毒。使用'open'三个参数是一个优点。如果STDOUT输出不被执行,它不应该构成威胁。 –

回答

0

你可以传递任意数据到print,它不会中断。但是:

  • 打印到文件句柄可能会经历各种IO层(如编码)。并非所有数据都可能对这些图层有效。例如。编码层将使用替换字符或在传送无效数据时终止脚本。

  • Perl的print不关心控制字符,如NULs,退格或回车,只是通过它们。根据输出的查看方式,它可能看起来混乱或可能会破坏查看应用程序。例如:用户输入等于字符串"\rHAHA"。当您打印"something$userinput"时,控制台上显示时可能会看到HAHAthing,因为回车将光标置于第1列。如果用户输入包含换行符,则可以打破输出记录,例如, "foo${userinput}bar"可能会成为foobar这两行。

  • 如果输入是机密信息,输出也是保密的,所以你应该确保输出不能被任何人查看。例如。在网页上显示包含调试信息的输出可能会使攻击者获得有关系统的更多信息。