我通过在数据集和多个参数下运行来优化非常耗时/耗费内存的程序。对于每个“运行”,我有一个csv文件,“setup.csv”设置为“runNumber”,每次运行“命令”。然后我将其导入perl脚本以读取我想要的运行编号的命令,推断变量,然后通过系统命令在系统上执行它。我是否应该担心这种情况有可能被剥削,(我现在很担心)?如果是这样,我该怎么做才能保护我们的服务器?我现在的计划是将“setup.csv”的文件权限更改为只读,将所有权更改为root,然后在需要将另一个运行附加到列表时以root身份进入。 非常感谢您的宝贵时间。
答案 0 :(得分:6)
使用-T
以污点模式运行代码。这将迫使您仔细清洗数据。只传递你期望的字符串。不要使用.*
进行清洗,而是检查好的字符串列表。
答案 1 :(得分:1)
理想情况下,有一个已知可接受值的列表,您可以对此进行验证。
无论哪种方式,您都希望使用system
的多参数形式或使用IPC::System::Simple的systemx
来避免使用shell。
如果无法避免shell,则必须正确转换文本以将命令传递给shell文字。
即使这样,您也必须小心以-
开头的值。许多工具接受--
来表示结束选项,允许其他值安全地传递。
最后,您可能希望确保args不包含NUL
字符(\0
)。
systemx('tool', '--', @args)
注意:在Windows中无法传递任意字符串。需要额外验证。