perl - 如何清理 Perl 中打开文件的输入

标签 perl checkmarx

我有一个 Perl 脚本,它打开一个文件,处理它并打印一些输出。 输入文件被 gzip 压缩。

$file 的路径作为参数传递给脚本。

以下是我当前使用的解决方案:

open(my $fh, "-|", "$gzcat $file") or die("Cannot open $file$!");

该脚本最近在Checkmarx的安全审核中失败,出现以下错误:

<script> gets user input for the $fh element. This element’s value then flows through the code without being properly sanitized or validated and is eventually displayed to the user in method <method>. This may enable a CrossSite-Scripting attack.

我尝试使用 perl -f 验证文件是否存在,并使用 $file =~ s/[^A-Za-z0-9_\-\.\/]//g; 删除不需要的字符。 ,但它不满足 Checkmarx。

我想知道清理包含 Perl 中文件路径的输入的正确方法是什么。

最佳答案

只要您使用的是支持 fork 的 Perl 5.8 或更高版本的操作系统,或者 Windows 上的 5.22 或更高版本,您就可以在运行命令时使用管道打开的列表形式绕过 shell。这可以避免文件名包含 shell 将解释的元字符(例如 & 和空格)的问题。

open(my $fh, "-|", $gzcat, $file) or die("Cannot open $file: $!");

但是,这并不是所要求的验证或清理,但避免漏洞和不当行为很重要。所提到的跨站点脚本可能性是由于显示的文件名所致,如下所述;例如,如果它显示在 HTML 页面中,则必须对它进行 HTML 转义,大多数模板系统都有执行此操作的方法。

关于perl - 如何清理 Perl 中打开文件的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60009766/

相关文章:

正则表达式:捕获括号内的任何内容,以及嵌套括号

javascript - 使用 perl 创建 html

arrays - 如何使对象成为数组引用?

java - CheckMarx XSRF 攻击问题

javascript - React 更新 checkmarx 标记的过时依赖项

c++ - 在 checkmarx 中运行时,C++ 中的内存泄漏和 Memory_free_on_stack 变量

android - checkmarx 报告了 Volley 的 REFELCTED_XSS_ALL_CLIENT

sonarqube - 我们能否用 SonarQube 替换静态应用程序安全测试 SAST 工具,如(Fortify、Checkmarx 和 IBM Appscan)

macos - 在 OS X 上部署独立的 GUI Perl 应用程序

perl - hash的元素如何求和?