rails如何安全地从rails命令运行系统命令

dc1*_*c10 10 security ruby-on-rails

我有一个ActiveJob触发系统脚本运行:

 `grunt custom-job --src=files --dest="file" --vars='#{user_input_vars_from_json}'`
Run Code Online (Sandbox Code Playgroud)

重点在于

user_input_vars_from_json
Run Code Online (Sandbox Code Playgroud)

是一个json配置,它来自控制器的用户输入参数.我确实验证了json格式,但是如何确保没有有害代码发送到我的系统命令?

cod*_*mev 1

我只想以此开头:任何用户输入都应被视为危险的。我不建议使用用户提供的输入执行任何命令。

您要做的第一件事就是尽可能锁定输入。考虑限制 的长度user_input_vars_from_json以防止缓冲区溢出和 DoS 攻击。我还建议尝试找出一种方法来验证和限制您尝试在 JSON 中设置的“var”,user_input_vars_from_json以过滤掉任何不需要的键/值。

清理输入后,您可以将Kernel#system与Shellwords结合使用,以在从作业中执行命令时尽可能接近安全:

require 'shellwords'
system("grunt", "custom-job", "--src=files", '--dest="file"', "--vars=\"#{Shellwords.escape(user_input_vars_from_json)}\""
Run Code Online (Sandbox Code Playgroud)