Rails拆分system调用参数规避Brakeman警告时如何实现输出重定向
修复方案
直接使用 Ruby Kernel#system 内置的 IO 重定向参数即可,无需依赖 shell 的 > 符号,修改后代码如下:
system('pg_dump', '-F', 'c', '--no-acl', '--no-owner', '--quote-all-identifiers', database_url, out: file_name)
原理解释
- 最初的字符串拼接写法会触发 shell 解析,若
database_url或file_name存在恶意构造的特殊字符,就会产生命令注入风险,这是Brakeman报警的根本原因。 - 改为数组参数调用
system的思路是正确的:这种模式会直接启动pg_dump进程,不经过shell层解析,自然不会识别shell专属的重定向符>,这就是之前修改后输出不生效的原因。 - Ruby的
system方法支持在参数末尾传入哈希配置IO重定向规则,out: file_name表示将命令的标准输出直接写入指定文件,全程不涉及shell解析,完全规避命令注入风险,同时可以通过Brakeman的安全扫描。
内容的提问来源于stack exchange,提问作者akira
相关产品推荐
相关产品推荐

