我根本不知道perl,但我需要更改一个exitsting程序,以提供更清晰的调试输出。
这是声明:
print $lfh "$ts\t$tid\t$msg\n";
其中$ msg将通过加入函数的参数来创建,如下所示:
my $msg = join( "\t", @_ );
$ msg中的某个地方我想添加一个用户在调用程序时提供的命令行参数。如果打印到stdout,是否存在利用漏洞的风险?
另请注意,如果要写入文件,$ lfh将取自环境变量(由前面的脚本本身设置),如下所示:
open my $lfh, ">>", $ENV{GL_LOGFILE}
我可以在perl安全上找到的信息没有说明打印声明,所以也许我只是完全偏执,但更安全而不是抱歉......
答案 0 :(得分:0)
您可以将任意数据传递给print
,但它不会中断。但是:
打印到文件句柄可能会经历各种IO层,如编码。并非所有数据都可能对这些图层有效。例如。编码图层将使用替换字符或在传递无效数据时终止脚本。
Perl的print
并不关心NUL,退格或回车等控制字符,只是将它们传递给它们。根据输出的查看方式,它可能看起来很混乱或者可能会破坏查看应用程序。示例:用户输入等于字符串"\rHAHA"
。当您打印"something$userinput"
时,您可能会在控制台上看到HAHAthing
,因为回车会将光标放在第1列中。如果用户输入包含换行符,则可以分解输出记录,例如"foo${userinput}bar"
可能会成为foo
和bar
两行。
如果输入是condidential信息,输出也将保密,因此您应确保任何人都无法查看输出。例如。在网页上显示包含调试信息的输出可能允许攻击者获取有关您系统的更多信息。